簡體   English   中英

如何使用JCheckBoxes選擇?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM