KeyEvent не генерируется JFrame Java? - PullRequest
2 голосов
/ 03 августа 2011

У меня есть Java-программа с JFrame и 3 JButtons.Я добавил кейлист в jframe.Когда я запускаю программу, открывается окно jframe, и по умолчанию выбирается первая кнопка.Моя проблема заключается в том, что KeyEvent не генерируется этим JFrame.Теперь, кроме добавления KeyListener в jframe, я также добавил KeyListener для кнопок.Теперь keyevent генерируется кнопками.

Как сделать так, чтобы JFrame генерировал KeyEvent вместо JButton, генерирующего их ??.

Ответы [ 2 ]

4 голосов
/ 03 августа 2011

Посмотрите здесь Как использовать привязки клавиш .
Альтернатива keylistener .

Вот небольшой пример, где есть кнопка с фокусоми обработать KeyEvent (F2).
При нажатии F2 щелкнул по кнопке процесс связывания клавиш ButtonClick, который выполнил печать System.out.

public class Example {
    static public void main( String[] s ) {
        EventQueue.invokeLater( new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.getContentPane().setLayout( new BorderLayout() );
                frame.setBounds( 50, 50, 600, 600 );
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                final JButton button = new JButton( new AbstractAction("MyButton") {
                    @Override
                    public void actionPerformed( ActionEvent e ) {
                        System.out.println("Button Clicked");
                    }
                });
                frame.getContentPane().add( button );
                frame.getRootPane().setDefaultButton( button );

                KeyStroke f2 = KeyStroke.getKeyStroke("F2");
                frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(f2, "clickButton");
                frame.getRootPane().getActionMap().put("clickButton", new AbstractAction() {
                    @Override
                    public void actionPerformed( ActionEvent e ) {
                        button.doClick();
                    }
                });
                frame.setVisible( true );
                // the Button has the focus
                button.requestFocus();
                // generate a KeyEvent 'F2' 
                KeyboardFocusManager.getCurrentKeyboardFocusManager().dispatchKeyEvent( new KeyEvent( frame, KeyEvent.KEY_PRESSED, 0, f2.getModifiers(), f2.getKeyCode(), f2.getKeyChar() ) );
            }
        });
    }
}
4 голосов
/ 03 августа 2011

Ключевое событие вызывается на текущем фокусированном компоненте (обычно это не JFrame)

...