如何使 JOptionPane.showConfirmDialog 默认没有选中?
Posted
技术标签:
【中文标题】如何使 JOptionPane.showConfirmDialog 默认没有选中?【英文标题】:How to make JOptionPane.showConfirmDialog have No selected by default? 【发布时间】: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();
;
【问题讨论】:
【参考方案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
指定按钮,initialValue
(options
值之一)指定默认值。
更新:您可以拨打showOptionDialog
而不是showConfirmDialog
。前者采用options
和initialValue
参数。
【讨论】:
但我不想自己指定“是”和“否”——我希望系统采用默认设置。这个可以吗? 另外,在我使用这个 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
,因为它没有它们。
更多的人可能正在寻找这个,所以为什么不提供一个“有效”的解决方案。
【讨论】:
以上是关于如何使 JOptionPane.showConfirmDialog 默认没有选中?的主要内容,如果未能解决你的问题,请参考以下文章