2009-08-16 4 views
7

스윙 JDialog의 취소 버튼, 즉 사용자가 키보드의 "취소"키를 누르면 자동으로 수행되는 버튼을 어떻게 설정할 수 있습니까?JDialog 취소 버튼

대화 상자는 대화 상자의 루트 창의 setDefaultButton 메서드를 통해 기본 동작을 제공합니다.

그게 도움이된다면, WinForms Form.CancelButton 속성에 대한 아날로그를 찾고 있습니다.

+0

탈출구를 의미하는 것으로 추측합니다. – NateS

답변

1

확장하지 않고 JDialog에서는 가능하지 않다고 생각합니다.

JOptionPane.showOptionDialog() (또는 다른 show 메소드 중 하나)를 사용하여 사용할 JButton을 전달할 수 있습니다. 전달 된 옵션 구성 요소 인 경우

는, 그들은 정상적으로 렌더링됩니다, 그래서 당신은 이런 식으로 뭔가를 할 수 :

int optionType = JOptionPane.DEFAULT_OPTION; 
int messageType = JOptionPane.PLAIN_MESSAGE; // no standard icon 

JButton ok = new JButton("ok"); 
JButton cancel = new JButton("cancel"); 
//add any handlers to the buttons 
... 
//construct options 
Object[] selValues = { ok, cancel }; 

//show dialog as normal, selected index will be returned. 
int res = JOptionPane.showOptionDialog(null, "message", 
     "title", optionType, messageType, null, selValues, 
     selValues[0]); 
+0

안녕하세요, 예를 들어 주셔서 감사합니다. 불행히도, 개별화 된 옵션 다이얼로그가 아닌 다양한 컨트롤을 사용하여 완전히 사용자 지정된 대화 상자가 필요합니다. 지금까지 보았 듯이 완벽하게 사용자 정의 된 패널을 전달할 수있는 메소드/오버로드가 없습니다. –

+1

나는 당신이 맞다고 생각한다. 커스텀 다이얼로그를 가지고 있다면, 스스로 처리를 구현할 필요가있다.하지만 JOptionPane에서 그렇게 처리 할 수는있다. SWT에서 FWIW를 사용하면 Dialog의 임의의 하위 클래스를 정의하고 open() 메소드를 호출하여 표시 할 수 있습니다. –

2

한 줄 솔루션 t은 어떤 구성 요소입니다

t.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
    .put(KeyStroke.getKeyStroke("ESCAPE"), btnCancel.getAction()); 

(대화 상자에서 JTextField와 같은 JButton을 제외하고).

+1

'put()'메소드의 두 번째 인수는 액션 맵이 아니라 액션 스크립트의 핵심입니다. 이것은'btnCancel.getAction()! = null'이고,'btnCancel.getAction()'에 의해 반환 된'Action'이 자신을 키로 사용하여't'에 대한 액션 맵에 등록 된 경우, 즉 작동합니다. 't.getActionMap(). put (btnCancel.getAction(), btnCancel.getAction())'가 이전에 호출되었을 경우. – Jesse

1

버튼에 동작 수신기를 연결하고 그 내부에 dialog.setVisible(false)을 호출하기 만하면됩니다.

+0

그냥 시도하십시오 ... 실제로 작동합니다 –

+0

당신은 질문에 대답하지 않습니다. 일반적으로 Esc 키를 사용하여 키 입력으로 대화 상자를 닫으려고했습니다. 적어도 그것이 내가 질문을 읽는 방법인데, 다시 읽는 것에 다소 모호합니다. – PhiLho

+0

죄송합니다. 지적 해 주셔서 감사합니다. 질문은 "버튼"이 아니라 "취소"키를 읽어야합니다. 나는 그것을 고쳐 줄 것이다. –

3

내가 볼 수있는 가장 좋은 방법은 루트 창 입력란을 사용하여 루트 창 작업 맵에 Action을 추가하고 해당 동작을 이스케이프 키에 연결하는 것입니다.

이 경우 Action이 필요합니다. (. 즉 cancelButton.getAction() != null) 당신의 취소 버튼의 동작은 액션으로 구현되는 경우,이 작동합니다 :

 
getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); 
getRootPane().getActionMap().put("CANCEL", cancelButton.getAction()); 

을 그렇지 않으면, 취소 버튼의 논리가 ActionListener 통해 구현되는 경우, 당신은 ActionListeneractionPerformed() 방법을 가질 수있다 논리를 구현하는 private void onCancel() 메소드를 호출하고 동일한 메소드를 호출하는 "취소"조치를 등록하십시오.

 
getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); 
getRootPane().getActionMap().put("CANCEL", new AbstractAction(){ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     onCancel(); 
    } 
});