2011-06-01 13 views
6

Editar
Downvoter, ¿cómo es esto una mala pregunta? He proporcionado un código de ejemplo ejecutable del problema. Si funciona para usted, por favor hágamelo saber o señale lo que no está claro.de enfoque y de clic del ratón eventos JComboBox no trabajar

Hola,
en el código de abajo que tiene una sola JComboBox en un JFrame, yo no me lo notifique cuando el ratón entra en el JComboBox o se hace clic o se centran ganó. Sin embargo, el PopupMenuEvent funciona correctamente.

¿Qué estoy haciendo mal? (Mi objetivo ha de ser alertado cuando se hace clic en el componente de texto de la JComboBox)

public class TestJComboBox extends javax.swing.JFrame 
{ 
    public TestJComboBox() 
    { 
     initComponents(); 
    } 

    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     jComboBox1 = new javax.swing.JComboBox(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
       formMouseClicked(evt); 
      } 
     }); 

     jComboBox1.setEditable(true); 
     jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); 
     jComboBox1.setName("jComboBox1"); // NOI18N 
     jComboBox1.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
       jComboBox1MouseClicked(evt); 
      } 
      public void mouseEntered(java.awt.event.MouseEvent evt) { 
       jComboBox1MouseEntered(evt); 
      } 
     }); 
     jComboBox1.addPopupMenuListener(new javax.swing.event.PopupMenuListener() { 
      public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) { 
      } 
      public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) { 
      } 
      public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) { 
       jComboBox1PopupMenuWillBecomeVisible(evt); 
      } 
     }); 
     jComboBox1.addFocusListener(new java.awt.event.FocusAdapter() { 
      public void focusGained(java.awt.event.FocusEvent evt) { 
       jComboBox1FocusGained(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(70, 70, 70) 
       .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 226, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(104, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(90, 90, 90) 
       .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(164, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold> 

    private void jComboBox1FocusGained(java.awt.event.FocusEvent evt) 
    { 
     System.out.println("JComboBox Focus gained"); 
    } 

    private void formMouseClicked(java.awt.event.MouseEvent evt) 
    { 
     System.out.println("Form clicked"); 
     jComboBox1.setFocusable(false); 
     jComboBox1.setFocusable(true); 
    } 

    private void jComboBox1MouseClicked(java.awt.event.MouseEvent evt) 
    { 
     System.out.println("JComboBox Click"); 
    } 

    private void jComboBox1PopupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) 
    { 
     System.out.println("JComboBox Visible menu"); 
    } 

    private void jComboBox1MouseEntered(java.awt.event.MouseEvent evt) 
    { 
     System.out.println("Entered JComboBox"); 
    } 

    public static void main(String args[]) 
    { 
     java.awt.EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new TestJComboBox().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify 
    private javax.swing.JComboBox jComboBox1; 
    // End of variables declaration 
} 

Gracias!

Respuesta

7

Posiblemente el infractor se ofendió al usar el editor de GUI de Netbeans. No me gusta, pero puedes utilizarlo si descubres que puedes mantener una GUI compleja con él. Personalmente lo odio debido a varios errores extremadamente molestos que solo se muestran cuando tratas de editar el formulario y pierde silenciosamente tu diseño y configuración de componentes. Pero eso está fuera del punto.

De todos modos, es necesario agregar el ActionListener como esto:

jComboBox1.getEditor().getEditorComponent().addMouseListener(...); 

JComboBox es realmente un componente compuesto con un JTextField, JButton, y JList enterrada en su interior, por lo que se añadió el ActionListener al componente de envoltura , cuando los eventos del mouse van realmente al JTextField interno.

+0

Bueno, usar Netbeans es una razón estúpida para ofenderse. De todos modos, muchas gracias por explicar el lugar correcto para agregar el oyente del mouse. ¡Funciona de maravilla! –

+1

: D Al igual que los borrachos que necesitan una razón para beber, los enemigos siempre encontrarán una razón. – enthusiasticgeek

0

No olvide que comboBox es en realidad un contenedor. Entonces, si realmente desea tener todos los eventos del mouse, debe agregar el oyente a todos los componentes que contiene.

 

public void addMouseListener(final MouseListener mouseListener) { 
    this.comboBox.addMouseListener(mouseListener); 

    final Component[] components = this.comboBox.getComponents(); 
    for(final Component component : components) { 
     component.addMouseListener(mouseListener); 
    } 
    this.comboBox.getEditor().getEditorComponent().addMouseListener(mouseListener); 
} 

favor visite swing mouse listeners being intercepted by child components para más detalles.

Cuestiones relacionadas