Кнопка по умолчанию в JFrame не срабатывает при нажатии клавиши ввода - программирование
Подтвердить что ты не робот

Кнопка по умолчанию в 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)
}  
4b9b3361

Ответ 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);
  }
}