В моей программе качания у меня есть JTextField и JButton. Я бы хотел, чтобы, как только пользователь нажимает клавишу "enter", запускается actionListener JButton. Как мне это сделать? Спасибо заранее.
Как связать нажатие "enter" с помощью кнопки?
Ответ 1
JRootPane имеет метод setDefaultButton (кнопка JButton), который будет делать то, что вы хотите. Если ваше приложение является JFrame, оно реализует интерфейс RootPaneContainer, и вы можете получить корневую панель, вызвав getRootPane() в JFrame, а затем вызовите setDefaultButton на корневой панели, которая была возвращена. Тот же метод работает для JApplet, JDialog или любого другого класса, который реализует RootPaneContainer.
Ответ 2
здесь есть пример
http://www.java2s.com/Code/Java/Swing-JFC/SwingDefaultButton.htm
это то, что вам нужно: rootPane.setDefaultButton(button2);
Ответ 3
Избавьтесь от ActionListeners. Это старый стиль для слушателей. Выпускник класса Action. Хитрость заключается в понимании работы InputMaps и ActionMaps. Это уникальная особенность Swing, которая действительно очень приятная:
http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html
Вот как вы это делаете:
JPanel panel = new JPanel();
panel.setLayout( new TableLayout( ... ) );
Action someAction = new AbstractAction( "GO" ) {
public void actionPerformed() {
}
};
InputMap input = panel.getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
input.put( KeyStroke.getKeyStroke( "enter", "submit" );
panel.getActionMap().put("submit", someAction );
panel.add( button = new JButton( someAction ) );
panel.add( textField = new JTextField( ) );
Использование WHEN_ANCESTOR_OF_FOCUSED_COMPONENT позволяет панели получать события клавиатуры от любого из них (например, предков). Поэтому независимо от того, какой компонент имеет фокус, пока он находится внутри панели, нажатие клавиши вызовет любое действие, зарегистрированное в разделе "отправить" в ActionMap.
Это позволяет вам повторно использовать действия в меню, кнопках или нажатиях клавиш, деля их.