2009-09-08 73 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); 
} 

}