[英]How to use JCheckBoxes selection for use?
我在JFrame上有一個復選框。 當我檢查它時,我想在命令窗口中顯示它已被選中。 以下是我正在使用的代碼。 它編譯並執行沒有錯誤,但是當我選中復選框時,我沒有在窗口中看到“已經選擇了一個”。
public Checklist() {
...
JCheckBox one = new JCheckBox("CT scan performed");
one.addItemListener(new CheckBoxListener());
}
private class CheckBoxListener implements ItemListener{
public void itemStateChanged(ItemEvent e)
{
if(e.getSource()==one){ if(one.isSelected()){
System.out.println("one has been selected");
}
else{System.out.println("nothing");}
}
}}
我已經測試了這個簡單的例子並且它完美地工作(當你選擇復選框時它會寫"one has been selected"
"nothing"
當你取消選中時它寫着"nothing"
):
import javax.swing.*;
import java.awt.event.*;
public class Example extends JFrame{
public JCheckBox one;
public Example() {
one = new JCheckBox("CT scan performed");
one.addItemListener(new CheckBoxListener());
setSize(300,300);
getContentPane().add(one);
setVisible(true);
}
private class CheckBoxListener implements ItemListener{
public void itemStateChanged(ItemEvent e) {
if(e.getSource()==one){
if(one.isSelected()) {
System.out.println("one has been selected");
} else {System.out.println("nothing");}
}
}
}
public static void main(String[] args) {
new Example();
}
}
在您的示例中,似乎在構造函數CheckList()
聲明了one
。 你確定它可以在內部類CheckBoxListener
訪問嗎?
您可能沒有意識到您的程序中實際上有兩個復選框!
我假設你的課看起來像這樣:
public class Checklist extends JFrame {
private JCheckBox one;
public Checklist() {
JCheckBox one = new JCheckBox("CT scan performed");
one.addItemListener(new CheckBoxListener());
this.add(one);
}
}
你有兩個“one”副本,一個屬於Checklist的“private JCheckBox one”,以及你的構造函數中的“JCheckBox one = ...”。 當你打電話時,你會注意到
one.addItemListener(new CheckBoxListener());
this.add(one);
你實際上是在構造函數中使用臨時的“one”,這與你班級頂層的“one”不同!
現在,當你打電話
if(e.getSource() == one)
你現在正在使用班級頂部的“一個”,這不是你在窗口中看到的復選框!
這就是刪除“JCheckBox”使你的程序工作的原因 - 現在構造函數中的“one”與你類頂部的“one”相同。
為了更清楚地說明這一點,下面的代碼就是你在破碎的例子中真正做的事情:
public class Checklist extends JFrame {
private JCheckBox one;
public Checklist() {
JCheckBox anotherOne = new JCheckBox("CT scan performed");
anotherOne.addItemListener(new CheckBoxListener());
this.add(anotherOne);
}
}
...
if(e.getSource() == one) //not equal to anotherOne!
您需要在除第七個之外的每個復選框上添加一個動作偵聽器,它沒有任何影響),並在每次調用偵聽器時重新計算按鈕的啟用狀態。 請參見addActionListener
。
為了實現這一點,您需要一種方法來檢查您關心的所有情況,並在達到狀態時采取適當的操作。 然后為每個復選框都有一個ActionListener,用於調用這一個worker方法。
你檢查過這條線嗎?
if(e.getSource()==one){
好嗎? 嘗試刪除它,看看它是否有幫助。 事件可能是真實來源的痛苦。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.