【问题标题】:How to make JOptionPane.showConfirmDialog have No selected by default?如何使 JOptionPane.showConfirmDialog 默认没有选中?
【发布时间】:2010-11-26 14:41:54
【问题描述】:

我在 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();
    }
};

【问题讨论】:

    标签: java swing joptionpane


    【解决方案1】:

    这是我想到的第一件事。

    //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]);
    

    但可能有更好的方法。

    【讨论】:

      【解决方案2】:

      使用这个构造函数:

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

      options 指定按钮,initialValueoptions 值之一)指定默认值。

      更新:您可以拨打showOptionDialog 而不是showConfirmDialog。前者采用optionsinitialValue 参数。

      【讨论】:

      • 但我不想自己指定“是”和“否”——我希望系统采用默认设置。这个可以吗?
      • 另外,在我使用这个 ocnstructor 创建一个新对象后,如何显示模态确认对话框?
      • 使用构造函数后,调用optionPane.createDialog(parent, "Title").setVisible(true)
      • 我看到的初始问题的唯一其他选项是覆盖已安装的 OptionPaneUI。看看 BasicOptionPaneUI.getInitialValueIndex()。但 IMO 上述建议的解决方案要简单得多。
      • 不幸的是,这会阻止键盘上的 Y 和 N 操作按钮。
      【解决方案3】:

      这是我的解决方案:

      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);
      }
      
      }
      

      【讨论】:

        【解决方案4】:

        如果您不想硬编码“是”和“否”(例如,当您的应用本地化为其他语言时),您可以使用 UIManager 资源:

        UIManager.getString("OptionPane.yesButtonText", l)
        UIManager.getString("OptionPane.noButtonText", l)
        

        【讨论】:

        • 还有按钮顺序的问题。在 gtk 上,用户实际上可以使用 gtk-alternative-button-order=1 指定顺序。我不知道你如何找到当前平台和设置的顺序。
        • 我希望使用 showConfirmDialog 来处理这取决于平台的外观和感觉:-)
        • @RoelSpilker OptionPane.buttonOrientation, OptionPane.isYesLast 等。或者劫持 BasicOptionPaneUI 的整个按钮面板。
        【解决方案5】:

        对于上面的例子,它是JOptionPane.showOptionDialog 这些参数不能传递给showConfirmDialog,因为它没有它们。

        更多的人可能正在寻找这个,所以为什么不提供一个“有效”的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-31
          • 1970-01-01
          • 1970-01-01
          • 2014-08-02
          • 1970-01-01
          相关资源
          最近更新 更多