0

JComboBox私は最初にアイテムで満たされた2つのコントロールを持っています。移動で1つのアイテムを選択するJComboBoxと、他のアイテムに移動しJComboBoxます。
この問題は、JComboBoxコントロールの1つが空の場合に発生します。アイテムを空に移動しようとすると、そのイベントJComboBoxがトリガーされます。actionPerformed

private void leftComboActionPerformed(java.awt.event.ActionEvent evt) {                                          
        Object selectedItem = leftCombo.getSelectedItem();
        leftCombo.removeItem(selectedItem);
        rightCombo.addItem(selectedItem);
    }                                         

    private void rightComboActionPerformed(java.awt.event.ActionEvent evt) {                                           
        Object selectedItem = rightCombo.getSelectedItem();
        rightCombo.removeItem(selectedItem);
        leftCombo.addItem(selectedItem);
    }

空にアイテムを追加するのはなぜJComboBoxですか?アイテムがいっぱいになったときにアイテムが追加されても起動しません。
空のときにイベントが発生しないようにするにはどうすればよいですか?

4

3 に答える 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ます。ソースコードに従う場合、これを無効にするメカニズムはありません。ただし、要素を追加する前にリスナーを無効にし、後で有効にすることができます。

于 2012-11-17T21:04:39.503 に答える
0

イベントを回避する方法は、インターフェイスactionPerformedのインスタンスであるコンボボックスのモデルを使用することです。javax.swing.ComboBoxModel

たとえば、DefaultComboBoxModel実装では、モデルに要素を追加したり、モデルから要素を削除したりできます。モデルを取得して作業し、モデルの準備ができたら、コンボボックスに戻します。

于 2015-07-31T07:48:39.623 に答える
0

選択を変更すると、ActionEventが発生する可能性があります。ソースコードに従う場合、これを無効にするメカニズムはありません。ただし、要素を追加する前にリスナーを無効にし、後で有効にすることができます。

// AB LUND PE CHARHO

于 2017-05-17T04:35:01.017 に答える