Установка привязки клавиш для выполнения того же действия, что и в моем слушателе действий - PullRequest
2 голосов
/ 26 июля 2011

У меня есть JButton, который присоединен к ActionListener, но я также хотел добавить клавишу быстрого доступа к кнопке, чтобы сделать ее более удобной для пользователя.Скажем, пользователь может нажать кнопку, и программа выполняет некоторую функцию «f», или пользователь также может нажать «Enter» на клавиатуре, чтобы выполнить ту же функцию f.Итак, вот как выглядит суть моего кода

private JButton button;

public static void main(String[] args){
    Action buttonListener = new AbstractAction() {
         public void actionPerformed(ActionEvent e) {
                //Perform function f    
         }
    };

button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ENTER"),
                        "test");
button.getActionMap().put("test",
                         buttonListener);

button.addActionListener(new OtherListener());
}

private class OtherListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        //Perform function f
    }
}

Кажется немного утомительным добавление Action и ActionListener для того же.Может быть, я не вижу этого, но есть ли способ сократить код, чтобы я мог устранить действие и просто использовать actionListener?Я думал о переключении параметра buttonListener в методе getActionMap (). Put (), но этот метод принимает только типы действий.

Ответы [ 2 ]

5 голосов
/ 26 июля 2011

Action расширяет ActionListener, поэтому вы должны иметь возможность определить один Action и использовать его там, где вам нужно ActionListener.

, например

public static void main(String[] args){
    Action buttonListener = new Action() {
         public void actionPerformed(ActionEvent e) {
                //Perform function f    
         }
    };
    button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
        .put(KeyStroke.getKeyStroke("ENTER"), "test");
    button.getActionMap().put("test", buttonListener);
    button.addActionListener(buttonListener);
}
4 голосов
/ 26 июля 2011

JRootPane имеет метод setDefaultButton(...), который будет делать то, что вы хотите. Вам нужно будет получить корневую панель из контейнера верхнего уровня, затем вы можете вызвать этот метод, передав ссылку на ваш JButton, и он выполнит свое действие, когда на GUI будет нажата кнопка ввода. И это имеет смысл, когда вы думаете об этом, как «ввод» - это специальный ключ, за поведение которого должен отвечать графический интерфейс, а не одна кнопка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...