Java 如何使JOptionPane.showConfirmDialog在默认情况下没有选择?
我用Java实现了一个“另存为”对话框,提示用户该文件是否已经存在,我希望默认情况下选择“否”选项。我该怎么做 这是我目前的代码:Java 如何使JOptionPane.showConfirmDialog在默认情况下没有选择?,java,swing,joptionpane,Java,Swing,Joptionpane,我用Java实现了一个“另存为”对话框,提示用户该文件是否已经存在,我希望默认情况下选择“否”选项。我该怎么做 这是我目前的代码: JFileChooser chooser = new JFileChooser() { public void approveSelection() { File selectedFile = getSelectedFile(); if (selectedFile != null && selected
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();
}
};
使用此构造函数:
JOptionPane(Object message, int messageType, int optionType,
Icon icon, Object[] options, Object initialValue)
其中选项
指定按钮,并让初始值
(其中一个选项
值)指定默认值
更新:您可以调用
showOptionDialog
而不是showConfirmDialog
。前者采用选项
和初始值
参数。这是我想到的第一件事
//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]);
但可能有更好的方法。如果您不想硬编码“是”和“否”(例如,当您的应用程序本地化为其他语言时),您可以使用UIManager资源:
UIManager.getString("OptionPane.yesButtonText", l)
UIManager.getString("OptionPane.noButtonText", l)
对于上面的示例,它是
JOptionPane.showOptionDialog
无法将这些参数传递给showConfirmDialog
,因为它没有这些参数
可能会有更多的人在寻找这个解决方案,为什么不提供一个“有效”的解决方案呢。这是我的解决方案:
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);
}
}
导入java.awt.Component;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入javax.swing.JDialog;
导入javax.swing.JFrame;
导入javax.swing.JOptionPane;
导入javax.swing.UIManager;
公共类NegativeDefaultButtonOptions窗格{
公共静态int showConfirmDialog(组件父组件、对象消息、字符串标题、int optionType){
列表选项=新建ArrayList();
实物期权;
开关(optionType){
案例作业窗格。确定\取消\选项:
options.add(UIManager.getString(“OptionPane.okbuttonext”);
添加(UIManager.getString(“OptionPane.cancelButtonText”);
defaultOption=UIManager.getString(“OptionPane.cancelButtonText”);
打破
案例作业窗格。是\否\选项:
添加(UIManager.getString(“OptionPane.yesButtonText”);
添加(UIManager.getString(“OptionPane.noButtonText”);
defaultOption=UIManager.getString(“OptionPane.noButtonText”);
打破
案例作业窗格。是\否\取消\选项:
添加(UIManager.getString(“OptionPane.yesButtonText”);
添加(UIManager.getString(“OptionPane.noButtonText”);
添加(UIManager.getString(“OptionPane.cancelButtonText”);
defaultOption=UIManager.getString(“OptionPane.cancelButtonText”);
打破
违约:
抛出新的IllegalArgumentException(“未知optionType”+optionType);
}
返回JOptionPane.showOptionDialog(父组件、消息、标题、optionType、JOptionPane.QUESTION_消息、null、options.toArray()、defaultOption);
}
}
但我不想自己指定“是”和“否”——我希望系统采用默认值。可以这样做吗?另外,在我使用此OC构造函数创建新对象后,如何显示模式确认对话框?在使用构造函数后,调用optionPane.createDialog(父,“标题”)。setVisible(true)我看到的初始问题的唯一其他选项是覆盖已安装的OptionPaneUI。请查看BasicOptionPaneUI.getInitialValueIndex()。但在我看来,上述解决方案要简单得多。不幸的是,这阻止了键盘上的Y和N操作按钮。仍然存在按钮顺序的问题。在gtk上,用户可以使用gtk alternative button order=1实际指定订单。我不知道您如何找到当前平台和设置的顺序。我希望使用showConfirmDialog可以根据平台的外观处理此问题:-)@RoelSpilker OptionPane.buttonOrientation、OptionPane.isYesLast等或highjack BasicOptionPaneUI的整个按钮面板。