2012-04-24 21 views
7

Tengo un JCombobox en mi código. He agregado el FocusLost event. Pero no se disparó de todos modos. He intentado mucho tiempo pero no encontré solución.JCombobox focusLost no se activa, ¿por qué?

jcbItemType.addFocusListener(new java.awt.event.FocusAdapter() { 
    public void focusLost(java.awt.event.FocusEvent evt) { 
     jcbItemTypeFocusLost(evt); 
    } 
}); 

private void jcbItemTypeFocusLost(java.awt.event.FocusEvent evt)          
    {           
     // TODO add your handling code here: 
     System.out.println("name=" + ((Component) evt.getSource()).getName()); 
     System.out.println("index=" + jcbItemType.getSelectedIndex()); 
    } 

Pero nada está impreso en la consola. Por favor sugiérame lo que estoy haciendo mal.

Respuesta

6
  • FocusListener oyente no es adecuado para JComboBox, en conjunto con otro Listener(s) puede crear bucle sin fin (especialmente editable JComboBox),

  • FocusListener es asíncrona, a veces es demasiado difícil de atrapar eventos es especialmente órdenes correctas en los casos que JComponents ha añadido otro Listener(s) demasiado

ejemplo de cómo escuchar para Focus de derivados JTextField/JFormattedTextField

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ComboBoxTwo extends JFrame implements ItemListener { 

    private static final long serialVersionUID = 1L; 
    private JComboBox mainComboBox; 
    private JComboBox subComboBox; 

    public ComboBoxTwo() { 
     String[] items = {"Select Item", "Color", "Shape", "Fruit"}; 
     String[] subItems1 = {"Select Color", "Red", "Blue", "Green"}; 
     mainComboBox = new JComboBox(items); 
     mainComboBox.addItemListener(this); 
     mainComboBox.addFocusListener(fcsListener); 
     add(mainComboBox, BorderLayout.WEST); 
     subComboBox = new JComboBox(subItems1); 
     subComboBox.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXX"); 
     subComboBox.addItemListener(this); 
     add(subComboBox, BorderLayout.EAST); 
    } 

    @Override 
    public void itemStateChanged(ItemEvent e) { 
     if (e.getStateChange() == ItemEvent.SELECTED) { 
      if (e.getSource() == mainComboBox) { 
       System.out.println("Source : mainComboBox"); 
      } else if (e.getSource() == subComboBox) { 
       System.out.println("Source : subComboBox"); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new ComboBoxTwo(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
// 
    private FocusListener fcsListener = new FocusListener() { 

     @Override 
     public void focusGained(FocusEvent e) { 
      dumpInfo(e); 
     } 

     @Override 
     public void focusLost(FocusEvent e) { 
      dumpInfo(e); 
     } 

     private void dumpInfo(FocusEvent e) { 
      System.out.println("Source : " + name(e.getComponent())); 
      System.out.println("Opposite : " + name(e.getOppositeComponent())); 
      System.out.println("Temporary: " + e.isTemporary()); 
      final Component c = e.getComponent();//works for editable JComboBox too 
      if (c instanceof JFormattedTextField) { 
       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         ((JFormattedTextField) c).selectAll(); 
        } 
       }); 
      } else if (c instanceof JTextField) { 
       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         ((JTextField) c).selectAll(); 
        } 
       }); 
      } 
     } 

     private String name(Component c) { 
      return (c == null) ? null : c.getName(); 
     } 
    }; 
} 
+0

He usado previamente 'itemStateChanged' pero es problemático para mi propósito y por lo tanto quiero usar el evento FocusLost. Su ejemplo no funcionó para mí aunque tiene un comentario como * // también funciona para JComboBox editable *. Pero no funciona para mí. Por favor avise. Lo estoy buscando por mucho tiempo. – sarwar026

+0

@ sarwar026 en esta forma funciona como esperaba, el resto se nota en mi respuesta, use ItemListener para JComboBox, por ejemplo en la forma en que publiqué aquí, – mKorbel

+0

@ sarwar026 simple No entiendo por qué motivo tiene que requerir FocusListener , para una mejor ayuda antes edite su pregunta con un [SSCCE] (http://sscce.org/) – mKorbel

5

he encontrado una manera muy simple de resolver esto.

El editor predeterminado de JComboBox tiene una clase interna BasicComboBoxEditor $ BorderlessTextField que es el componente que obtiene y pierde el foco.

Se puede acceder simplemente

Component component = comboBox.getEditor().getEditorComponent(); 
if (component instanceof JTextField) 
    JTextField borderlesstextfield = (JTextField) borderless; 

A continuación, añadir un oyente enfoque como lo haría con cualquier JTextField

borderlesstextfield.addFocusListener(new FocusListener() 
{ 
    public void focusGained(FocusEvent e) 
    { 
    } 
    public void focusLost(FocusEvent e) 
    { 
    } 
}}); 

Ahora usted tiene una FocusListener que responda como se espera que ganar y pérdida de foco para el ComboBox

+0

Esto funcionó perfectamente y debería ser la respuesta aceptada ya que es mucho menos intrincado. – Xerus

Cuestiones relacionadas