2012-11-17 77 views
0

我有2 JComboBox控件最初充滿了項目。選擇JComboBox中的一個項目將其移動到另一個JComboBox
JComboBox控件之一爲空時,會發生此問題。當我嘗試將項目移動到空的JComboBox時,它會觸發actionPerformed事件。在空JComboBox觸發器上調用addItem觸發器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

下面的代碼轉儲堆棧跟蹤

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事件的方法是使用組合框的模型,該模型是javax.swing.ComboBoxModel接口的實例。

例如DefaultComboBoxModel實現允許您向模型添加/刪除元素。你得到模型,在模型上工作,當模型準備就緒時,你將它設置回組合框。

0

更改選擇可能會導致觸發一個ActionEvent。如果您遵循源代碼,則沒有任何機制可以禁用此功能。但是,您可以在添加元素之前禁用偵聽器,然後啓用它。

// AB LUND PE CHARHO