2013-10-21 33 views
1

這可能看起來像一個非常微不足道的問題,但我不能想出一個簡單的解決方案。我確定有一個。Java - 跟蹤新的列表項目以備以後刪除?

我有一個複選框菜單項(可以選擇或不選擇的菜單項)。每當它被選中,我希望它創建並添加一個新的對象到某個列表。當它被取消選中時,我希望將該對象從列表中刪除。該對象是即時創建的,所以我沒有提及它。

我的問題是:如何取消選擇對象?

final JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem("My Item");         
menuItem.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     if (menuItem.isSelected()) { 
      someList.add(new someClass());        
     } 
     else { 
      someList.remove(??); 
     } 
    } 
}); 

我想擴展JCheckBoxMenuItem類的並增加了SomeClass的領域,所以我總是有參考新創建的對象的。它應該在技術上的工作,但似乎並不是最優雅的解決方案...

+0

你爲什麼要選擇當菜單項到某一物添加到一定名單?這個對象是什麼?如果您想要一個優雅的解決方案,我們必須瞭解您正在嘗試做什麼。 –

+0

@Vianney Dupoy de Guitard:我有不斷更新的傳入數據。無論何時接收到數據,我的程序都會遍歷一系列指標,每個指標都與數據有所不同,並向我顯示結果。我有一個巨大的指標選擇,我不希望他們都立即活躍,因此只有被檢查的將在列表中,其餘的應該被刪除。 – SportySpice

+0

@SpotySpice然後SrikanthLingala的回覆是正確的。使用這個:'Map '。當你需要檢索所有的指標時,使用'myMap.myMap.values()',它將返回一個'MyIndi​​catorClass'列表。 –

回答

2

在這種情況下,我建議使用Map。您可以使用複選框(例如checkbox1)的對應值作爲鍵,並將新創建的對象作爲值。當您取消選中該複選框時,您可以獲得checkbox的名稱和(在本例中爲checkbox1)並將其從Map中刪除。

+0

我真的想過這個解決方案,但是一開始就避免了它,因爲我在某處讀了一個'Map'對迭代不好。我現在嘗試使用map.values(),像@VianneyDupoydeGuitard建議的那樣,它的工作完美。謝謝。 – SportySpice

0

我認爲你是添加一個新項目菜單時,它被選中,並且添加的條目希望被刪除,當它被取消選中。是這樣嗎?

0

我想你需要ArrayList.clear()

someList.clear() 

如果你想從列表中的列表呼叫clear()方法刪除所有元素。

@Override 
    public void actionPerformed(ActionEvent ae) { 
     if (menuItem.isSelected()) { 
      someList.add(new someClass());        
     } 
     else { 
      someList.clear(); 
     } 
    } 
+0

不,這將清除整個列表,而不僅僅是從列表中刪除取消選擇的項目。 – NickJ

1

所提供的信息,我會用我的coustom Action對象存儲所創建的對象。下面是一個例子(很瑣碎,當然,因爲它只是創建了一個String,但它演示的目的):

JCheckBoxMenuItem item = new JCheckBoxMenuItem(new AbstractAction("...") { 
    // Store the object here. 
    private String someObject; 

    public void actionPerformed(ActionEvent e) { 
     JCheckBoxMenuItem source = (JCheckBoxMenuItem) e.getSource(); 
     if (source.isSelected()) { 
      someObject = "Object " + source.getText(); // trivial. 
      someList.add(someObject); 
     } 
     else { 
      someList.remove(someObject); 
      someObject = null; 
     } 
    } 
}); 
+0

當我接受其他答案時,我沒有看到您的答案。我只是試過這個,它也在工作,謝謝。你認爲這是一個更好的解決方案嗎? – SportySpice

+0

我不太瞭解您的實際問題,但另一種解決方案可能會引入不需要的副作用(例如內存泄漏)。我認爲我的解決方案的好處在於,它將業務邏輯封裝在操作中,並且在業務代碼(在這種情況下爲列表/映射)中不使用GUI類(作爲鍵)。 –