web-dev-qa-db-ja.com

JOptionPane.showConfirmDialogをデフォルトで選択しないようにする方法は?

Javaに[名前を付けて保存]ダイアログを実装し、ファイルがすでに存在する場合にユーザーにプロンプ​​トを表示します。デフォルトで[いいえ]オプションを選択したいのですが、どうすればよいですか?

これが私の現在のコードです:

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();
    }
};
23
splintor

次のコンストラクタを使用します。

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

ここで、optionsはボタンを指定し、initialValueoptions値の1つ)はデフォルトを指定します。

pdate:showOptionDialogではなくshowConfirmDialogを呼び出すことができます。前者はoptionsおよびinitialValueパラメータを取ります。

16
Vinay Sajip

それが私の頭に浮かぶ最初のことです。

//Custom button text
Object[] options = {"Yes",
                    "No"};
JOptionPane.showOptionDialog(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]);

しかし、おそらくもっと良いアプローチがあります。

20
Carlos Tasada

これは私の解決策です:

import Java.awt.Component;
import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.UIManager;


public class NegativeDefaultButtonJOptionPane {

public static int showConfirmDialog(Component parentComponent, Object message, String title, int optionType) {
    List<Object> options = new ArrayList<Object>();
    Object defaultOption;
    switch(optionType){
    case JOptionPane.OK_CANCEL_OPTION:
        options.add(UIManager.getString("OptionPane.okButtonText"));
        options.add(UIManager.getString("OptionPane.cancelButtonText"));
        defaultOption = UIManager.getString("OptionPane.cancelButtonText");
        break;
    case JOptionPane.YES_NO_OPTION:
        options.add(UIManager.getString("OptionPane.yesButtonText"));
        options.add(UIManager.getString("OptionPane.noButtonText"));
        defaultOption = UIManager.getString("OptionPane.noButtonText");
        break;
    case JOptionPane.YES_NO_CANCEL_OPTION:
        options.add(UIManager.getString("OptionPane.yesButtonText"));
        options.add(UIManager.getString("OptionPane.noButtonText"));
        options.add(UIManager.getString("OptionPane.cancelButtonText"));
        defaultOption = UIManager.getString("OptionPane.cancelButtonText");
        break;
        default:
            throw new IllegalArgumentException("Unknown optionType "+optionType);
    }
    return JOptionPane.showOptionDialog(parentComponent, message, title, optionType, JOptionPane.QUESTION_MESSAGE, null, options.toArray(), defaultOption);
}

}
6
subes

「はい」と「いいえ」をハードコーディングしたくない場合(たとえば、アプリが他の言語にローカライズされている場合)、UIManagerリソースを使用できます。

UIManager.getString("OptionPane.yesButtonText", l)
UIManager.getString("OptionPane.noButtonText", l)
6
Koen Weyn

上記の例では、JOptionPane.showOptionDialogこれらの引数がないため、showConfirmDialogに渡すことはできません。

より多くの人々がこれを探しているかもしれないので、「実用的な」ソリューションを提供してみませんか。

1
Cristian