2009-09-08 72 views
23

我在Java中实现了另存为对话框,提示用户该文件是否已经存在,并且我希望默认选择否选项。我该怎么做呢?如何使JOptionPane.showConfirmDialog默认没有选中?

这里是我当前的代码:

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(); 
    } 
}; 
+0

我更新了我的答案。 – 2009-09-08 21:04:20

回答

15

使用这个构造:

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

其中options指定的按钮,并有initialValue(在options值之一)指定默认的是什么。您可以拨打showOptionDialog而不是showConfirmDialog。前者需要optionsinitialValue参数。

+1

但我不想自己指定“是”和“否” - 我希望系统采用其默认设置。这可以做到吗? – splintor 2009-09-08 19:45:26

+0

另外,在使用此ocnstructor创建新对象后,如何显示模态确认对话框? – splintor 2009-09-08 19:45:57

+0

您使用构造, 后调用optionPane.createDialog(父,“标题”)。调用setVisible(真) – 2009-09-09 12:44:11

19

这是我想到的第一件事。

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

但可能有更好的方法。

6

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

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

仍然存在按钮顺序的问题。在gtk上,用户实际上可以使用gtk-alternative-button-order = 1指定顺序。我不知道如何找到当前平台和设置的顺序。 – 2010-02-10 13:40:34

+0

我希望这取决于平台的外观和感觉:-) – 2010-02-10 13:42:02

+0

@RoelSpilker OptionPane.buttonOrientation,OptionPane.isYesLast,等等。或者劫持BasicOptionPaneUI的整个按键面板使用showConfirmDialog的处理。 – Trejkaz 2014-05-26 13:41:44

1

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

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

6

这是我的解决方案:

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

}