Кнопка по умолчанию в JFrame не срабатывает при нажатии клавиши ввода
У меня есть JFrame
с тремя JButtons на нем. Я установил txtSearch
(a JTextField
) для фокусировки при загрузке JFrame
. Одна из кнопок установлена в качестве кнопки по умолчанию. Это мой код:
private void formWindowOpened(java.awt.event.WindowEvent evt)
{
// btnRefresh.setMnemonic(KeyEvent.VK_R); // Even if this line
// is not commented, but
// still the event wouldn't fire.
this.getRootPane().setDefaultButton(btnRefresh);
}
Когда он загружается, кнопка просто выбрана, но при нажатии клавиши Enter она ничего не делала. Как его правильно реализовать?
btnRefresh.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRefreshActionPerformed(evt);
}
});
private void btnRefreshActionPerformed(java.awt.event.ActionEvent evt) {
JOptionPane.showMessageDialog(this, "Pressed!");
// Other codes here (Replace by JOptionPane)
}
Ответы
Ответ 1
Какой компонент имеет фокус, когда появляется JFrame
? Я спрашиваю, потому что некоторые компоненты "едят" событие "Enter". Например, JEditorPane
сделает это.
Кроме того, при назначении ActionListener
to JTextField
вместо DefaultButton
для корневой панели будет вызываться ActionListener
. Вы должны выбрать либо ActionListener
, либо DefaultButton
, но вы не можете иметь огонь для одного и того же JTextField
. Я уверен, что это относится и к другим компонентам.
Ответ 2
Я не вижу, что вы делаете неправильно из того, что опубликовано. Вот краткий пример, который работает. Возможно, это откроет вам что-то полезное.
import java.awt.BorderLayout;
public class ExampleFrame extends JFrame
{
private JPanel m_contentPane;
private JTextField m_textField;
/**
* Launch the application.
*/
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
ExampleFrame frame = new ExampleFrame();
frame.setVisible(true);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public ExampleFrame()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
m_contentPane = new JPanel();
m_contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
m_contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(m_contentPane);
m_textField = new JTextField();
m_contentPane.add(m_textField, BorderLayout.NORTH);
m_textField.setColumns(10);
JButton btnNewButton = new JButton("Default");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(ExampleFrame.this, "Default.");
}
});
m_contentPane.add(btnNewButton, BorderLayout.CENTER);
JButton btnNewButton_1 = new JButton("Not default");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(ExampleFrame.this, "Not default.");
}
});
m_contentPane.add(btnNewButton_1, BorderLayout.WEST);
m_textField.requestFocus();
getRootPane().setDefaultButton(btnNewButton);
}
}