sirve que para itemstatechanged item changed java swing jcombobox itemlistener

java - itemstatechanged para que sirve



¿Por qué itemStateChanged en JComboBox se llama dos veces cuando se cambia? (10)

Estoy usando un JComboBox con un ItemListener en él. Cuando se cambia el valor, el evento itemStateChanged se llama dos veces. La primera llamada, ItemEvent, muestra el elemento original seleccionado. En la segunda vez, muestra el artículo que acaba de seleccionar el usuario. Aquí hay un código de prueba:

public Tester(){ JComboBox box = new JComboBox(); box.addItem("One"); box.addItem("Two"); box.addItem("Three"); box.addItem("Four"); box.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ System.out.println(e.getItem()); } }); JFrame frame = new JFrame(); frame.getContentPane().add(box); frame.pack(); frame.setVisible(true); }

Así que cuando cambié el cuadro Combo una vez de "Uno" a "Tres", la consola muestra:

One Three

¿Hay alguna manera que yo pueda decir usando el ItemEvent tal vez, que es el segundo elemento (es decir, el elemento seleccionado por el usuario)? Y si alguien puede explicar por qué se llama dos veces, ¡eso también sería bueno!

Gracias


  1. Cuando el elemento any se selecciona del cuadro combinado, desencadena internamente el cambio de selección, es decir, llamará a la función setSelectedItem.
  2. Si se implementa un detector de eventos itemStateChanged explícito, setSelectedItem llamará itemStateChanged. Por lo tanto, cuando se selecciona un elemento, llama a setSelectedItem y luego llama a itemStateChanged.
  3. A medida que cambia el valor del cuadro combinado, incluso eso también desencadena itemStateChanged y, por lo tanto, se llama a itemStateChanged.
  4. Había escrito un oyente para el cambio de elemento para manejar el cambio en el valor del cuadro combinado cuando se configuraba internamente desde el código y eso causaba que la función se llamara dos veces.

Aquí están los 2 rastreos posteriores, que se invocan cuando se selecciona un valor del cuadro combinado.

Primera vez en el cambio de valor real:

dataMgr.MainInterface.jComboBoxPaymentStatusValueChangeHandle(MainInterface.java:1431), dataMgr.MainInterface.jComboBoxPaymentStatusItemStateChanged(MainInterface.java:1676), dataMgr.MainInterface.access$600(MainInterface.java:28), dataMgr.MainInterface$7.itemStateChanged(MainInterface.java:437), javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1223), javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1271), javax.swing.JComboBox.contentsChanged(JComboBox.java:1330), javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:118), javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:93), javax.swing.JComboBox.setSelectedItem(JComboBox.java:576), javax.swing.JComboBox.setSelectedIndex(JComboBox.java:622), javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:852), java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290), java.awt.Component.processMouseEvent(Component.java:6533), javax.swing.JComponent.processMouseEvent(JComponent.java:3324), javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:501), java.awt.Component.processEvent(Component.java:6298), java.awt.Container.processEvent(Container.java:2236), java.awt.Component.dispatchEventImpl(Component.java:4889), java.awt.Container.dispatchEventImpl(Container.java:2294), java.awt.Component.dispatchEvent(Component.java:4711), java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888), java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525), java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466), java.awt.Container.dispatchEventImpl(Container.java:2280), java.awt.Window.dispatchEventImpl(Window.java:2746), java.awt.Component.dispatchEvent(Component.java:4711), java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758), java.awt.EventQueue.access$500(EventQueue.java:97), java.awt.EventQueue$3.run(EventQueue.java:709), java.awt.EventQueue$3.run(EventQueue.java:703), java.security.AccessController.doPrivileged(Native Method), java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76), java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86), java.awt.EventQueue$4.run(EventQueue.java:731), java.awt.EventQueue$4.run(EventQueue.java:729), java.security.AccessController.doPrivileged(Native Method), java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76), java.awt.EventQueue.dispatchEvent(EventQueue.java:728), java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201), java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116), java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105), java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101), java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93), java.awt.EventDispatchThread.run(EventDispatchThread.java:82)]

2da vez desde el debido a la operación en combobox

dataMgr.MainInterface.jComboBoxPaymentStatusValueChangeHandle(MainInterface.java:1431), dataMgr.MainInterface.jComboBoxPaymentStatusItemStateChanged(MainInterface.java:1676), dataMgr.MainInterface.access$600(MainInterface.java:28), dataMgr.MainInterface$7.itemStateChanged(MainInterface.java:437), javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1223), javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1280), javax.swing.JComboBox.contentsChanged(JComboBox.java:1330), javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:118), javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:93), javax.swing.JComboBox.setSelectedItem(JComboBox.java:576), javax.swing.JComboBox.setSelectedIndex(JComboBox.java:622), javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:852), java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290), java.awt.Component.processMouseEvent(Component.java:6533), javax.swing.JComponent.processMouseEvent(JComponent.java:3324), javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:501), java.awt.Component.processEvent(Component.java:6298), java.awt.Container.processEvent(Container.java:2236), java.awt.Component.dispatchEventImpl(Component.java:4889), java.awt.Container.dispatchEventImpl(Container.java:2294), java.awt.Component.dispatchEvent(Component.java:4711), java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888), java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525), java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466), java.awt.Container.dispatchEventImpl(Container.java:2280), java.awt.Window.dispatchEventImpl(Window.java:2746), java.awt.Component.dispatchEvent(Component.java:4711), java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758), java.awt.EventQueue.access$500(EventQueue.java:97), java.awt.EventQueue$3.run(EventQueue.java:709), java.awt.EventQueue$3.run(EventQueue.java:703), java.security.AccessController.doPrivileged(Native Method), java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76), java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86), java.awt.EventQueue$4.run(EventQueue.java:731), java.awt.EventQueue$4.run(EventQueue.java:729), java.security.AccessController.doPrivileged(Native Method), java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76), java.awt.EventQueue.dispatchEvent(EventQueue.java:728), java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201), java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116), java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105), java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101), java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93), java.awt.EventDispatchThread.run(EventDispatchThread.java:82)]


Cita de Java Tutorial :

"Solo se puede seleccionar un elemento a la vez en un cuadro combinado, de modo que cuando el usuario hace una nueva selección, el elemento seleccionado previamente se deselecciona. Por lo tanto, se disparan dos eventos de elemento cada vez que el usuario selecciona un elemento diferente del menú . el usuario elige el mismo artículo, no se disparan los eventos del elemento ".


De acuerdo con este thread ,

Se dispara cuando deja un resultado y luego vuelve a llamar cuando se establece en otro resultado

No escuche por itemStateChanged. Use un ActionListener en su lugar, que es bueno para manejar eventos del combo.
Necesita un ItemStateListener si necesita manejar por separado la deselección / selección dependiendo del elemento involucrado.

Cambiar el estado del elemento dentro de itemStateChanged hace que itemStateChanged se active ... esto se llama "reentrance".


Echa un vistazo aquí,

box.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ if(e.getStateChange()==1) { //this will trigger once only when actually the state is changed JOptionPane.showMessageDialog(null, "Changed"); } } });

Cuando selecciona una nueva opción, solo llamará una vez al JOptionPane, lo que indica que el código se llamará solo una vez.


Eche un vistazo a esta fuente:

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Tester { public Tester(){ JComboBox box = new JComboBox(); box.addItem("One"); box.addItem("Two"); box.addItem("Three"); box.addItem("Four"); box.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ System.out.println(e.getItem() + " " + e.getStateChange() ); } }); JFrame frame = new JFrame(); frame.getContentPane().add(box); frame.pack(); frame.setVisible(true); } public static void main(String [] args) { Tester tester = new Tester(); } }

Use getStateChange para determinar si un elemento está seleccionado o no seleccionado


El código es:

public class Tester { private JComboBox box; public Tester() { box = new JComboBox(); box.addItem("One"); box.addItem("Two"); box.addItem("Three"); box.addItem("Four"); box.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == 1) { JOptionPane.showMessageDialog(box, e.getItem()); System.out.println(e.getItem()); } } }); JFrame frame = new JFrame(); frame.getContentPane().add(box); frame.pack(); frame.setVisible(true); } }


Quería obtener la cadena de índice después de seleccionar y configurar en combobox

comboBox1.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if(e.getStateChange() == ItemEvent.SELECTED) { comboBox1ItemStateChanged(); } } });


Yo puedo hacerlo así:

import java.awt.event.*; jComboBox1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Hello"); } });


JComboBox.setFocusable(false) hará el truco.


private void dropDown_nameItemStateChanged(java.awt.event.ItemEvent evt) { if(evt.getStateChange() == ItemEvent.SELECTED) { String item = (String) evt.getItem(); System.out.println(item); } }

¡Buena suerte!