2012-03-08 25 views
16

Tengo un JFrame con tres JButtons en él. Configuré txtSearch (un componente JTextField) para enfocar cuando se carga JFrame. Uno de los botones está configurado como el botón predeterminado. Este es mi código:El botón predeterminado en JFrame no se activa cuando se presiona la tecla enter

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

Cuando se carga, el botón se acaba de seleccionar, pero no hizo nada cuando el Introduzca clave estaba siendo presionado. ¿Cómo lo implemento correctamente?

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) 
} 
+0

Descubrí que la manera más fácil es llamar a requestFocusInWindow() DESPUÉS de que JFrame esté visible para establecer un botón predeterminado. Espero que esto ayude a alguien. – GeriBoss

Respuesta

10

¿Qué componente tiene foco cuando aparece el JFrame? Lo pregunto porque algunos componentes "comen" el evento de la tecla Intro. Por ejemplo, un JEditorPane hará eso.

Además, cuando se asigna una ActionListener a JTextField, la ActionListener serán llamados en lugar de la DefaultButton para el panel raíz. Debe elegir tener un ActionListener o un DefaultButton, pero no puede tener ambos disparos por el mismo JTextField. Estoy seguro de que esto se aplica a otros componentes también.

+0

He configurado 'JTextField' para enfocar cuando cargas' JFrame'. –

+1

análisis correcto, no es una solución :-) @johntotetwoo desde que acepta esto Supongo que lo apuntó en la dirección de una solución - podría considerar editar su pregunta con esa solución – kleopatra

+0

Brillante .. Tengo un ActionListener en mi campo de contraseña y no se dio cuenta de que era la causa de que el botón predeterminado no respondiera. Gracias – Olu

0

No veo lo que está haciendo incorrectamente de lo que se publica. Aquí hay un pequeño ejemplo que funciona. Tal vez revelará algo útil para ti.

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); 
    } 
} 
+1

agrega un actionListener al textField y mira lo que sucede :-) – kleopatra

+0

¡Lo has clavado en kleopatra! Cuando coloqué el ActionListener, el botón predeterminado no se activó. johntotetwoo, debes * eliminar * el oyente de acción para que se desactive el botón predeterminado. –

Cuestiones relacionadas