developer tip

스윙 : ESC 키를 눌렀을 때 대화 상자를 어떻게 닫습니까?

optionbox 2020. 12. 7. 08:04
반응형

스윙 : ESC 키를 눌렀을 때 대화 상자를 어떻게 닫습니까?


Swing을 사용한 GUI 개발.

내 응용 프로그램에서 열 파일을 선택하기위한 사용자 지정 대화 상자가 있습니다. 이 클래스는 확장 javax.swing.JDialog되고 다른 구성 요소 중에서 a JFileChooser를 포함하며 표시하거나 숨길 수 있습니다.

JFileChooser파일 츄가 표시 될 때 (내 대화에 포함) 내가 ESC, 파일 츄 - 가죽 자체를 누릅니다 구성 요소는 이미 그 자체로 ESC 키를 처리합니다.

이제 대화 상자도 똑같이하고 싶습니다. ESC 키를 누르면 대화 상자가 닫힙니다. 포함 된 파일 선택기가 표시되면 ESC 키로 만 숨겨야합니다.

어떤 아이디어?


사용 InputMapActionMap스윙의 핵심 작업을 처리합니다. 대화 상자를 깨끗하게 닫으려면 창 닫기 이벤트를 보냅니다.

웹 로그에서 :

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

반응형