views:

1754

answers:

4

I implemented a Save As dialog in Java that prompts the user if the file already exists, and I want the No option to be selected by default. How do I do this?

Here is my current code:

JFileChooser chooser = new JFileChooser()
{
    public void approveSelection()
    {
        File selectedFile = getSelectedFile();
        if (selectedFile != null && selectedFile.exists( ) )
        {
            int response = JOptionPane.showConfirmDialog(
                    this,
                    "The file " + selectedFile.getName() + " already exists."
                        + " Do you want to replace the existing file?",
                    getDialogTitle(),
                    JOptionPane.YES_NO_OPTION,
                    JOptionPane.WARNING_MESSAGE);
            if (response != JOptionPane.YES_OPTION )
            {
                return;
            }
        }

        super.approveSelection();
    }
};
+5  A: 

Use this constructor:

JOptionPane(Object message, int messageType, int optionType,
            Icon icon, Object[] options, Object initialValue)

where options specifies the buttons, and have initialValue (one of the options values) specify what the default is.

Update: You can call showOptionDialog rather than showConfirmDialog. The former takes options and initialValue parameters.

Vinay Sajip
But I don't want to specify the "Yes" and "No" myself - I want the system to take its defaults. Can this be done?
splintor
Also, after I create a new object using this ocnstructor, how do I show the modal confirm dialog?
splintor
after using the constructor, you call optionPane.createDialog(parent, "Title").setVisible(true)
Koen Weyn
The only other option for the initial question that I see is to override the installed OptionPaneUI. Have a look at BasicOptionPaneUI.getInitialValueIndex(). But IMO the solutions suggested above, are much more simpler.
Koen Weyn
@Koen Weyn : Thanks. I guess I'll use the showOptionsDialog option, as the createDialog seems cumbersome. How do I get the user selection when using createDialog? In any case, I find it very strange that Swing don't have a built-in support for this.
splintor
+1  A: 

That's the first thing that comes to my mind.

//Custom button text
Object[] options = {"Yes",
                    "No"};
JOptionPane.showConfirmDialog(this, "The file " + selectedFile.getName() + 
                  " already exists. Do you want to replace the existing file?", 
                  getDialogTitle(), 
                  JOptionPane.YES_NO_OPTION, 
                  JOptionPane.WARNING_MESSAGE, 
                  null, options, options[1]);

But probably there's a better approach.

Carlos Tasada
+2  A: 

If you don't want to hardcode "Yes" and "No" (for instance when your app is localized for other languages), you can use UIManager resources:

UIManager.getString("OptionPane.yesButtonText", l)
UIManager.getString("OptionPane.noButtonText", l)
Koen Weyn
There is still the issue of the order of the buttons. On gtk, the user can actually specify the order using gtk-alternative-button-order=1. I don't know how you can find the order for the current platform and setting.
Roel Spilker
And I hope that using the showConfirmDialog handles this depending on the platform look and feel :-)
Roel Spilker
A: 

For the above example, it is JOptionPane.showOptionDialog Those arguments can no be passed to showConfirmDialog because it does not have them.

More people might be looking for this so why not offer a "working" solution.

Cristian