Вызов addItem на пустые триггеры JComboBox actionPerformed event


4 принят

Следующий фрагмент кода сбрасывает трассировку стека

import javax.swing.JComboBox;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class EmptyComboboxTest {
  public static void main( String[] args ) {
    EventQueue.invokeLater( new Runnable() {
      @Override
      public void run() {
        JComboBox<String> emptyBox = new JComboBox<String>();
        emptyBox.addActionListener( new ActionListener() {
          @Override
          public void actionPerformed( ActionEvent e ) {
            Thread.dumpStack();
          }
        } );
        emptyBox.addItem( "test" );
      }
    } );
  }
}

Соответствующая его часть

at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1260)
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1331)
at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:118)
at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:94)
at javax.swing.DefaultComboBoxModel.addElement(DefaultComboBoxModel.java:132)

Если вы посмотрите в исходном коде, вы увидите, что при добавлении элемента он будет выбран, если в данный момент ничего не выбрано

    if ( objects.size() == 1 && selectedObject == null && anObject != null ) {
        setSelectedItem( anObject );
    }

Изменение выбора может привести к обстрелу ActionEvent. Если вы следуете исходному коду, нет механизма для его отключения. Тем не менее, вы можете отключить прослушиватель, прежде чем добавлять элемент, и затем включить его.


0

Способ избежать actionPerformedсобытия - использовать модель combo box, которая является экземпляром javax.swing.ComboBoxModelинтерфейса.

Например, DefaultComboBoxModelреализация позволяет добавлять / удалять элементы в / из модели. Вы получаете модель, работаете над ней, и, когда модель готова, вы установите ее обратно в поле со списком.


0

Изменение выбора может привести к срабатыванию ActionEvent. Если вы следуете исходному коду, нет механизма для его отключения. Тем не менее, вы можете отключить прослушиватель, прежде чем добавлять элемент, и затем включить его.

// AB LUND PE CHARHO

ява, качели, событие, ActionListener, JComboBox,

java,swing,events,actionlistener,jcombobox,

0

Ответов: 3


4 принят

Следующий фрагмент кода сбрасывает трассировку стека

import javax.swing.JComboBox;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class EmptyComboboxTest {
  public static void main( String[] args ) {
    EventQueue.invokeLater( new Runnable() {
      @Override
      public void run() {
        JComboBox<String> emptyBox = new JComboBox<String>();
        emptyBox.addActionListener( new ActionListener() {
          @Override
          public void actionPerformed( ActionEvent e ) {
            Thread.dumpStack();
          }
        } );
        emptyBox.addItem( "test" );
      }
    } );
  }
}

Соответствующая его часть

at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1260)
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1331)
at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:118)
at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:94)
at javax.swing.DefaultComboBoxModel.addElement(DefaultComboBoxModel.java:132)

Если вы посмотрите в исходном коде, вы увидите, что при добавлении элемента он будет выбран, если в данный момент ничего не выбрано

    if ( objects.size() == 1 && selectedObject == null && anObject != null ) {
        setSelectedItem( anObject );
    }

Изменение выбора может привести к обстрелу ActionEvent. Если вы следуете исходному коду, нет механизма для его отключения. Тем не менее, вы можете отключить прослушиватель, прежде чем добавлять элемент, и затем включить его.


0

Способ избежать actionPerformedсобытия - использовать модель combo box, которая является экземпляром javax.swing.ComboBoxModelинтерфейса.

Например, DefaultComboBoxModelреализация позволяет добавлять / удалять элементы в / из модели. Вы получаете модель, работаете над ней, и, когда модель готова, вы установите ее обратно в поле со списком.


0

Изменение выбора может привести к срабатыванию ActionEvent. Если вы следуете исходному коду, нет механизма для его отключения. Тем не менее, вы можете отключить прослушиватель, прежде чем добавлять элемент, и затем включить его.

// AB LUND PE CHARHO

ява, качели, событие, ActionListener, JComboBox,