2009-11-20 3 views
4

JOptionPane의 좌상 구석의 클로즈드 x를 무효화하고 싶습니다만, 어떻게하면 좋습니까?JOptionPane의 클로즈 x를 무효화하는 방법

+2

가 왜 그렇게 하시겠습니까? JOptionPane에는 일반적으로 "Cancel"또는 "No"버튼이 있어야합니다. 닫기 버튼을 누르면 해당 버튼과 일관되게 동작해야합니다. – ykaganovich

+0

나는 ykaganovich와 동의해야한다. 이것은 사용자 경험 관점에서 나쁜 생각처럼 보입니다. 사용자가 옵션을 선택하지 않은 경우 아마도 a) 아무 것도하지 않거나 b) 적절한 기본값을 선택하는 것이 좋습니다. – ssakl

+0

내가 정말로하고 싶은 질문을 잘못 설명했을 수도 있습니다. 닫기 버튼을 없애는 것입니다 (이것이 사과 인간 인터페이스 가이드 라인에서 제안하는 것이며 내 사장님은 HIG와 사랑에 빠졌습니다). 결국에는 닫기 버튼에 취소 버튼과 동일한 기능을 부여하는 것이 더 쉬워 져서 이것이 내가 한 일입니다. 감사. – Mike2012

답변

1

사용자가 옵션을 선택하지 않고 닫으려고 할 때 항상 대화 상자를 다시 표시 할 수 있습니다. sun.com에서 기본 닫기 동작을 재정의하는 방법에 대한 예가 있습니다. "중지 자동 대화 상자 닫기"에서보고들은 다음과 같은 코드가 있습니다 만 수에

final JOptionPane optionPane = new JOptionPane(
       "The only way to close this dialog is by\n" 
       + "pressing one of the following buttons.\n" 
       + "Do you understand?", 
       JOptionPane.QUESTION_MESSAGE, 
       JOptionPane.YES_NO_OPTION); 

final JDialog dialog = new JDialog(frame, 
          "Click a button", 
          true); 
dialog.setContentPane(optionPane); 
dialog.setDefaultCloseOperation(
    JDialog.DO_NOTHING_ON_CLOSE); 
dialog.addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent we) { 
     setLabel("Thwarted user attempt to close window."); 
    } 
}); 

optionPane.addPropertyChangeListener(
    new PropertyChangeListener() { 
     public void propertyChange(PropertyChangeEvent e) { 
      String prop = e.getPropertyName(); 

      if (dialog.isVisible() 
      && (e.getSource() == optionPane) 
      && (prop.equals(JOptionPane.VALUE_PROPERTY))) { 
       //If you were going to check something 
       //before closing the window, you'd do 
       //it here. 
       dialog.setVisible(false); 
      } 
     } 
    }); 
dialog.pack(); 
dialog.setVisible(true); 

int value = ((Integer)optionPane.getValue()).intValue(); 
if (value == JOptionPane.YES_OPTION) { 
    setLabel("Good."); 
} else if (value == JOptionPane.NO_OPTION) { 
    setLabel("Try using the window decorations " 
      + "to close the non-auto-closing dialog. " 
      + "You can't!"); 
} 

그 코드를 사용하여, 당신은 쉽게 사용자가 사용할 수 중 하나를 클릭 할 때 창을 닫아야 주석 부분을 적용 할 수 옵션이 아니라 닫는 버튼.

0

JOptionPane에서이를 수행 할 방법이 있는지 확실하지 않습니다.

일반적으로 JOptionPane이 제공하는 것보다 더 많은 유연성을 원할 때 (기본적으로 몇 개의 대화 상자에 대한 정적 팩키지), JDialog을 사용하여 자체 대화 상자를 작성합니다.

JDialog는 상속 된 메서드 setUndecorated을 제공하므로 X을 모두 제거합니다. 더 많은 작업이 필요하지만 원하는대로 대화 상자를 만들 수 있습니다.

3

마이클,

닫기 [x] 버튼을 비활성화하는 방법을 모르겠습니다. 또는 사용자가 클릭 할 때 아무 것도 할 수 없습니다. 아래 코드를 확인하십시오 :

JOptionPane pane = new JOptionPane("message"); 
JDialog dialog = pane.createDialog(null, "Title"); 
dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
dialog.setVisible(true); 

적합합니까?

+0

JDialog 내부에 캡슐화 된 경우 패널의 반환 값을 얻는 방법은 어떻게 될까요? – Mike2012

+0

Sun에서 제공 한 답변을 보면, 찾고있는 것을하는 방법을 보여줍니다. 기본적으로 반환 값을 가져 오려면 JOptionPane에 대한 참조를 유지해야합니다. –

+0

나는 당신의 대답을 좋아합니다. 나를 위해 매력처럼 작동합니다. 감사 – jotapdiez

2

당신은있는 JOptionPane에 선언 취소 버튼을하여 종료 버튼을 덮어하고 그에 따라 취소 작업을 처리 할 수 ​​

JOptionPane optionPane= new JOptionPane("message", JOptionPane.OK_CANCEL_OPTION); 

final JDialog dialog = optionPane.createDialog(null, "Input"); 
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
dialog.addWindowListener(new WindowAdapter() { 
@Override public void windowClosing(WindowEvent e) { 
    optionPane.setValue(JOptionPane.CANCEL_OPTION); 
} 
}); 

if (JOptionPane.CANCEL_OPTION!= ((Integer) optionPane.getValue()).intValue()) 
        throw new myCancellationException(); 
관련 문제