2015-04-27 45 views
0

我的程序使用多個JComboBox和JButton來允許用戶顯示如何以及顯示哪些數據。直到今天我這樣做有很多這樣的:以有效的方式將幾個JComboBox,JButtons轉換爲集合<String>

if (e.getSource() == someMenü_or_Button){ 
     if(someMenü_or_Button.getSelectedItem()=="showstuff")display.oneOfManySetter(0);    
} 

現在,我以爲我可以收集在一個Set<String> Attributes = new HashSet<String>();

所有的選項,但在我的方式,結果這難道不是更多的代碼效率也沒有有更好的表現,因爲我做的:

public void actionPerformed(ActionEvent e) { 
attributes.clear(); 

if(someMenü1.getSelectedItem()== "sum"); 
else attributes.add(someMenü.getSelectedItem()); 
//and so on. 

attributes.add(someButton1.getName()); 
//and so on 

//And in addition: 
if (e.getSource() == someButton1){ 
     if(someButton1.getText()=="option1")original.setText("option2"); 
     else someButton1.setText("option1"); 
} 

所以我的問題是我能以某種方式轉換的JComboBox成收集和(我知道那是可能的)從集合中刪除嗎?然後我會再次添加JComboBox的選定項目。

我知道這些鍵的問題是我應該使用一個開關......

EDIT 16:12

要什麼我想這樣做,而不是具體的一個代碼示例:

//somewhere 
private Set<String> attributes = new HashSet<String>(); 
JComboBox<String> menu; 
String[] values = {"option1","option2","option3","option4"}; 
panel.add (menu = new JComboBox<>(values),gbc); 
menu.addActionListener(this);  

public void actionPerformed(ActionEvent e) { 

    if(e.getSource() == menu){ 
      attributes.removeAll(menu.getCollection());  //HOW?????? 
      attributes.add(menu.getSelectedItem()); 
    } 
} 
+1

請您提供一個更完整的例子嗎?我在這裏看不到任何可辨別的模式。此外,格式是可怕的... –

+3

這很危險:'someMenü_or_Button.getSelectedItem()==「showstuff」'。我知道這不是你的主要問題,但是將字符串與'=='進行比較是危險的代碼,自從'=='和'!='比較一個對象引用是否與另一個對象引用相同你不關心這件事。相反,如果兩個字符串變量保持相同的字符串表示形式,則使用「equals(...)」或「equalsIgnoreCase(...)」方法。 –

+1

可能比使用一個ActionListener進行所有操作更好,然後嘗試使用配電盤邏輯來決定它應該做什麼,將使用匿名內部類ActionListeners,並使這些監聽器變得簡單,也許讓他們只需調用Control類的一個方法。 –

回答

0

我不知道你爲什麼要轉換菜單。您已經在values數組中有鍵。我理解錯了什麼嗎?這個小例子正在做你想做的事情嗎?

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 

public class SomeClass extends JFrame implements ActionListener { 

    private Set<String> attributes = new HashSet<>(); 
    private String[] values = { "a", "b", "c", "d" }; 
    private JComboBox<String> menu = new JComboBox<>(values); 

    public SomeClass() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     init(); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new SomeClass(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // attributes.add(); 
     if (e.getSource() instanceof JComboBox<?>) { 
      JComboBox<?> menu = (JComboBox<?>) e.getSource(); 
      String s = (String) menu.getSelectedItem(); 
      attributes.removeAll(Arrays.asList(values)); 
      attributes.add(s); 
      System.out.println(s); 
      System.out.println(attributes); 
     } 
    } 

    private void init() { 
     menu.addActionListener(this); 
     add(menu); 
    } 

} 
+0

好吧,我認爲這是一個愚蠢的問題,我的糟糕的代碼萌芽;)我認爲你的答案無論如何是正確的,但我具體將不得不把'values'和'menu'放在init()之外。 – Cthaeh

相關問題