Кнопка по умолчанию в JFrame не срабатывает при нажатии клавиши ввода - PullRequest
16 голосов
/ 08 марта 2012

У меня есть JFrame с тремя кнопками J на ​​нем. Я установил txtSearch (компонент 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)
}  

Ответы [ 2 ]

10 голосов
/ 08 марта 2012

Какой компонент имеет фокус, когда появляется JFrame? Я спрашиваю, потому что некоторые компоненты «съедают» событие Enter key. Например, JEditorPane сделает это.

Кроме того, когда вы присваиваете ActionListener для JTextField, вместо 10000 * для корневой панели будет вызываться ActionListener Вы должны выбрать либо ActionListener, либо DefaultButton, но вы не можете иметь оба огня для одного и того же JTextField. Я уверен, что это относится и к другим компонентам.

0 голосов
/ 08 марта 2012

Я не вижу, что вы делаете неправильно из того, что опубликовано.Вот короткий пример, который работает.Возможно, это откроет вам что-то полезное.

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);
  }
}
...