스윙 : ESC 키를 눌렀을 때 대화 상자를 어떻게 닫습니까?
Swing을 사용한 GUI 개발.
내 응용 프로그램에서 열 파일을 선택하기위한 사용자 지정 대화 상자가 있습니다. 이 클래스는 확장 javax.swing.JDialog
되고 다른 구성 요소 중에서 a JFileChooser
를 포함하며 표시하거나 숨길 수 있습니다.
JFileChooser
파일 츄가 표시 될 때 (내 대화에 포함) 내가 ESC, 파일 츄 - 가죽 자체를 누릅니다 구성 요소는 이미 그 자체로 ESC 키를 처리합니다.
이제 대화 상자도 똑같이하고 싶습니다. ESC 키를 누르면 대화 상자가 닫힙니다. 포함 된 파일 선택기가 표시되면 ESC 키로 만 숨겨야합니다.
어떤 아이디어?
사용 InputMap
및 ActionMap
스윙의 핵심 작업을 처리합니다. 대화 상자를 깨끗하게 닫으려면 창 닫기 이벤트를 보냅니다.
내 웹 로그에서 :
private static final KeyStroke escapeStroke =
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
public static final String dispatchWindowClosingActionMapKey =
"com.spodding.tackline.dispatch:WINDOW_CLOSING";
public static void installEscapeCloseOperation(final JDialog dialog) {
Action dispatchClosing = new AbstractAction() {
public void actionPerformed(ActionEvent event) {
dialog.dispatchEvent(new WindowEvent(
dialog, WindowEvent.WINDOW_CLOSING
));
}
};
JRootPane root = dialog.getRootPane();
root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
escapeStroke, dispatchWindowClosingActionMapKey
);
root.getActionMap().put( dispatchWindowClosingActionMapKey, dispatchClosing
);
}
다음 스 니펫을 사용할 수 있습니다. 이것은 rootPane이 대화 상자의 모든 구성 요소에서 이벤트를 가져 오기 때문에 더 좋습니다. 원하는 경우 setVisible (false)을 dispose ()로 바꿀 수 있습니다.
public static void addEscapeListener(final JDialog dialog) {
ActionListener escListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
}
};
dialog.getRootPane().registerKeyboardAction(escListener,
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
JComponent.WHEN_IN_FOCUSED_WINDOW);
}
Java 8의 새로운 기능을 사용하는 기술을 찾고 있다면 람다 표현식을 사용해보십시오.
dialog.getRootPane().registerKeyboardAction(e -> {
window.dispose();
}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
또는
KeyStroke k = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
int w = JComponent.WHEN_IN_FOCUSED_WINDOW;
dialog.getRootPane().registerKeyboardAction(e -> window.dispose(), k, w);
두 가지 상위 답변을 모두 구현하는 데 문제가 있습니다. 다음 은 텍스트 기반 필드 내에서 작동 AbstractAction
하는 대부분 Action
의 메서드 를 자동 구현 하는 데 사용하는 다소 간결한 버전입니다 (@pratikabu의 요청에 따라).
final AbstractAction escapeAction = new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent ae) {
dispose();
}
};
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "ESCAPE_KEY");
getRootPane().getActionMap().put("ESCAPE_KEY", escapeAction);
참고 문헌
여기 내꺼, 나도 CtrlW클로징 쇼컷으로 추가해
Action closeAction = new AbstractAction(){
public void actionPerformed(ActionEvent e){
dispose();
}
};
KeyStroke esc = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0);
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(esc, "closex");
getRootPane().getActionMap().put("closex", closeAction);
KeyStroke ctrlW = KeyStroke.getKeyStroke("control W");
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ctrlW, "close");
getRootPane().getActionMap().put("close", closeAction);
참고 URL : https://stackoverflow.com/questions/642925/swing-how-do-i-close-a-dialog-when-the-esc-key-is-pressed
'developer tip' 카테고리의 다른 글
Vue.js-단일 파일 구성 요소에서 전역 적으로 사용 가능한 도우미 기능 만들기 (0) | 2020.12.07 |
---|---|
.net에서 프로그래밍 방식으로 연결 문자열 구성을 설정하려면 어떻게해야합니까? (0) | 2020.12.07 |
Linux에서 인터페이스의 IP 주소 가져 오기 (0) | 2020.12.07 |
Ubuntu 9.10에서 openCV를 확인하는 방법 (0) | 2020.12.07 |
SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1064 SQL 구문에 오류가 있습니다 — PHP — PDO (0) | 2020.12.07 |