2011-06-18 23 views
8

tengo editable JComboBox y deseo añadir valores a la misma desde su entrada, Es cuando me escribir algo en JComboBox y pulse enter Quiero que el texto aparezca en JComboBox lista:editable JComboBox

public class Program extends JFrame 
    implements ActionListener { 
    private JComboBox box; 

    public static void main(String[] args) { 
     new Program().setVisible(true); 
    } 

    public Program() { 
     super("Text DEMO"); 
     setSize(300, 300); 
     setLayout(new FlowLayout()); 
     Container cont = getContentPane(); 
     box = new JComboBox(new String[] { "First", "Second", "..." }); 
     box.setEditable(true); 
     box.addActionListener(this); 
     cont.add(box); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     box.removeActionListener(this); 
     box.insertItemAt(box.getSelectedItem(), 0); 
     box.addActionListener(this); 
    } 
} 

lamentablemente cuando pulso ingrese dos valores insertados en lugar de uno.

¿Por qué?

+0

Modifiqué su publicación, invierta si ... – mKorbel

Respuesta

16

Desde el API para JComboBox:

El ActionListener recibirá un ActionEvent cuando se ha realizado una selección. Si el cuadro combinado es editable, se activará un ActionEvent cuando se haya detenido la edición.

Por lo tanto, su ActionListener se llama dos veces.

Para agregar solamente el artículo a la JComboBox cuando editado, se puede comprobar la correcta ActionCommand así:

@Override 
public void actionPerformed(ActionEvent e) { 
    if (e.getActionCommand().equals("comboBoxEdited")) { 
    //code 
    } 
} 

edición (-> evento hilo de expedición)

Como ya se ha mencionado por trashgod, también debe crear y mostrar su marco solo en el hilo de envío del evento:

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Program().setVisible(true); 
     } 
    }); 
} 
+2

+1 También comience en [el hilo de envío del evento] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

+1

con para la salida de JComboBox hacia el exterior, es decir, a la GUI es mejor buscar ItemListener, desde la salida de JComboBox a sí misma es necesaria Acción +1 – mKorbel

+0

Solo una pregunta rápida: ¿el comando de acción "comboBoxEdited" se gritó al oyente de forma automática, o tengo que agregarAcciónComando de alguna manera? – Pureferret