스윙 JDialog
의 취소 버튼, 즉 사용자가 키보드의 "취소"키를 누르면 자동으로 수행되는 버튼을 어떻게 설정할 수 있습니까?JDialog 취소 버튼
대화 상자는 대화 상자의 루트 창의 setDefaultButton
메서드를 통해 기본 동작을 제공합니다.
그게 도움이된다면, WinForms Form.CancelButton
속성에 대한 아날로그를 찾고 있습니다.
스윙 JDialog
의 취소 버튼, 즉 사용자가 키보드의 "취소"키를 누르면 자동으로 수행되는 버튼을 어떻게 설정할 수 있습니까?JDialog 취소 버튼
대화 상자는 대화 상자의 루트 창의 setDefaultButton
메서드를 통해 기본 동작을 제공합니다.
그게 도움이된다면, WinForms Form.CancelButton
속성에 대한 아날로그를 찾고 있습니다.
확장하지 않고 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]);
안녕하세요, 예를 들어 주셔서 감사합니다. 불행히도, 개별화 된 옵션 다이얼로그가 아닌 다양한 컨트롤을 사용하여 완전히 사용자 지정된 대화 상자가 필요합니다. 지금까지 보았 듯이 완벽하게 사용자 정의 된 패널을 전달할 수있는 메소드/오버로드가 없습니다. –
나는 당신이 맞다고 생각한다. 커스텀 다이얼로그를 가지고 있다면, 스스로 처리를 구현할 필요가있다.하지만 JOptionPane에서 그렇게 처리 할 수는있다. SWT에서 FWIW를 사용하면 Dialog의 임의의 하위 클래스를 정의하고 open() 메소드를 호출하여 표시 할 수 있습니다. –
한 줄 솔루션 t은 어떤 구성 요소입니다
t.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
.put(KeyStroke.getKeyStroke("ESCAPE"), btnCancel.getAction());
(대화 상자에서 JTextField와 같은 JButton을 제외하고).
'put()'메소드의 두 번째 인수는 액션 맵이 아니라 액션 스크립트의 핵심입니다. 이것은'btnCancel.getAction()! = null'이고,'btnCancel.getAction()'에 의해 반환 된'Action'이 자신을 키로 사용하여't'에 대한 액션 맵에 등록 된 경우, 즉 작동합니다. 't.getActionMap(). put (btnCancel.getAction(), btnCancel.getAction())'가 이전에 호출되었을 경우. – Jesse
버튼에 동작 수신기를 연결하고 그 내부에 dialog.setVisible(false)
을 호출하기 만하면됩니다.
그냥 시도하십시오 ... 실제로 작동합니다 –
당신은 질문에 대답하지 않습니다. 일반적으로 Esc 키를 사용하여 키 입력으로 대화 상자를 닫으려고했습니다. 적어도 그것이 내가 질문을 읽는 방법인데, 다시 읽는 것에 다소 모호합니다. – PhiLho
죄송합니다. 지적 해 주셔서 감사합니다. 질문은 "버튼"이 아니라 "취소"키를 읽어야합니다. 나는 그것을 고쳐 줄 것이다. –
내가 볼 수있는 가장 좋은 방법은 루트 창 입력란을 사용하여 루트 창 작업 맵에 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
통해 구현되는 경우, 당신은 ActionListener
의 actionPerformed()
방법을 가질 수있다 논리를 구현하는 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(); } });
탈출구를 의미하는 것으로 추측합니다. – NateS