2009-09-08 4 views
23

파일이 이미 존재하는 경우 사용자에게 묻는 Save As 대화 상자를 Java로 구현했으며 기본적으로 No 옵션을 선택하려고합니다. 어떻게해야합니까?JOptionPane.showConfirmDialog를 만드는 방법은 기본적으로 선택되어 있지 않습니까?

JOptionPane(Object message, int messageType, int optionType, 
      Icon icon, Object[] options, Object initialValue) 
options이 버튼을 지정

및합니다 (options 값 중 하나를) initialValue가 기본이 무엇인지 지정

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

내 대답을 업데이 트 : –

답변

15

사용이 생성자 :

여기에 내 현재 코드입니다.

업데이트 : 당신은 showOptionDialog보다는 showConfirmDialog 호출 할 수 있습니다. 전자는 optionsinitialValue 매개 변수를 사용합니다.

+1

하지만 "예"와 "아니오"를 직접 지정하고 싶지는 않습니다 - 시스템이 기본값을 사용하기를 원합니다. 이 작업을 수행 할 수 있습니까? – splintor

+0

또한이 ocnstructor를 사용하여 새 객체를 만든 후에 모달 확인 대화 상자를 어떻게 표시합니까? – splintor

+0

옵션을 사용하면 optionPane.createDialog (parent, "Title")를 호출합니다. setVisible (true) –

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

아마도 더 좋은 방법이 있습니다. 위의 예를 들어

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

은 "아니오"(앱이 다른 언어로 지역화 예를 들면), 당신의 UIManager 자원을 이용할 수있다 그것은 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); 
} 

} 
+0

버튼 순서에 문제가 있습니다. gtk에서, 사용자는 실제로 gtk-alternative-button-order = 1을 사용하여 순서를 지정할 수 있습니다. 현재 플랫폼 및 설정의 순서를 찾는 방법을 모르겠습니다. –

+0

그리고 showConfirmDialog를 사용하면 플랫폼의 모양과 느낌에 따라 다음과 같이 처리 할 수 ​​있기를 바랍니다. –

+0

@RoelSpilker OptionPane.buttonOrientation, OptionPane.isYesLast 등등. 또는 BasicJetupPaneUI의 전체 버튼 패널을 하이 잭으로 사용하십시오. – Trejkaz

1

: 당신이 "예"하드 코딩하지 않으려면

6

내 솔루션입니다.