2013-01-15 58 views
1

我在Swing Project中有一些複選框。對於每個複選框,選擇/取消選擇要執行的特定查詢。我知道越來越複選框源的一種方式是如何知道哪個JCheckBox發送了ItemEvent

public void itemStateChanged(ItemEvent e) { 
if(e.getSource=="checkbox object") 
{ 
some code goes here; 
} 
} 

如果我有少數複選框比這個解決方案是最好的,但如果我有很多的複選框,然後我不得不寫冗長的代碼。有沒有辦法找到導致單個命令中的事件的複選框的對象?

回答

5

你可以得到選擇複選框,這樣

JCheckBox checkBox1 = new JCheckBox("Check1"); 
JCheckBox checkBox2 = new JCheckBox("Check2"); 
checkBox1.setName("Check1"); 
checkBox2.setName("Check2"); 
ItemListener listener = new ItemListener() { 
    @Override 
    public void itemStateChanged(ItemEvent e) { 
     JCheckBox check = (JCheckBox)e.getSource(); 
     String name = check.getName(); 
     System.out.println(name); 
    } 
}; 
checkBox1.addItemListener(listener); 
checkBox2.addItemListener(listener); 
+0

我得到輸出爲「null」。 –

+0

@RohanKandwal忘了將setName設置爲複選框。 checkBox1.setName( 「檢查1」);現在更新。或者你可以使用'check.getText()' – vels4j

+0

checkBox1.setName(「Check1」);做了訣竅,但是有可能獲得複選框對象,如「checkBox1」作爲輸出? –

1

如果您以統一的方式處理檢查,可能會幫助將JChekBox置入HashMap,將它們映射到某些可幫助處理事件的結構(可能是數據源或某個處理對象)。通過創建,添加和註冊複選框的方法可以進一步減少代碼量。總的想法是沿線

HashMap<JCheckBox, String> urls = new HashMap<JCheckBox, String>(); 
    // Here I use String but can be any complex data structure. 

ActionListener listener = new ActionListener() {   
    public void actionPerformed(ActionEvent e) { 
     String url = urls.get(e.getSource()); 
        // Work with the selected URL now 
    } 
}; 

void buildCheckBoxes() { 
    register("http://wikipedia.org"); 
    register("http://stackoverflow.com"); 
      // and 101 others, or load the list from the file. 
} 

void register(String url) { 
    JCheckBox box = new JCheckBox("Use "+url); 
    urls.put(box, url); 
    box.addActionListener(listener); 
      // One listener for all, defined above 
    myPanel.add(box); 
      // Some panel probably with GridLayout 
} 

從另一個方面,如果你的行爲有很大的不同,這也可能是更好的有一個單獨的偵聽器(可能是內部或匿名類),爲每個不同的動作:

JCheckBox boxA = new JCheckBox("A"); 
    JCheckBox boxB = new JCheckBox("B"); 

boxA.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
       // Only code for boxA 
    } 
}); 

boxB.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
       // Only code for boxB 
    } 
}); 

只要監聽器中有更多的代碼,就應該將它移動到主類的方法中。

+0

我仍然是一個noob和學習的基礎知識,所以我不知道如此深的編碼 –

0

如果你想知道哪些組件(或複選框或任何其他組件)的生成Java中的事件,您可以使用指定的名稱到組件「 setName(name)「方法。

// For CheckBox 
JCheckBox checkBox1 = new JCheckBox(); 
checkBox1.setName("CheckBox1"); 

// Any other Component 
JButton button1 = new JButton(); 
button1.setName("Button1"); 

現在在偵聽器類中,您可以獲取生成當前事件的源對象。

// CheckBox Listener 
public void itemStateChanged(ItemEvent e) 
{ 
    JCheckBox source = (JCheckBox)e.getSource(); 

    if(source.getName().equals("CheckBox1")) 
    { 
     //some code goes here; 
    } 
} 
+0

我知道使用equals的方式,我已經說過,如果我們使用太多的複選框,這種方式會導致更長的代碼。我想要一個代碼來獲取複選框的對象,如「checkBox1」作爲輸出。 –

+0

Switch語句可以與Java 1.7中的字符串一起使用。 – h22

+0

如果您打算爲多個組件使用單個偵聽器,那麼您將進行檢查以識別源組件。你可以把它寫在** itemStateChanged **方法或其他方法/類中,但最後你會寫在某個地方。如果您想避免檢查,那麼最佳做法是爲每個組件編寫單獨的偵聽器。這樣你的代碼變得簡單而簡短,因爲你不會有檢查來識別源代碼。 –

相關問題