3

JFrameにチェックボックスがあります。チェックすると、選択されていることをコマンドウィンドウに表示したい。以下は私が使用しているコードです。エラーなしでコンパイルおよび実行されますが、チェックボックスを選択したときにウィンドウに「1つが選択されました」と表示されません。

 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");}
            }
     }}
4

5 に答える 5

5

私はこの簡単な例をテストしましたが、完全に機能します("one has been selected"チェックボックスを選択した"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();
    }
}

あなたの例でoneは、コンストラクターで宣言されているようですCheckList()。内部クラスでアクセスできると確信していますCheckBoxListenerか?

于 2011-02-21T19:13:34.273 に答える
4

プログラムで実際に2つのチェックボックスが実行されていることに気付かない場合があります。

あなたのクラスは次のようになっていると思います。

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」、「private JCheckBox one」、およびコンストラクター内の「JCheckBox one=...」の2つのコピーがあります。次に、電話をかけると気付くでしょう

one.addItemListener(new CheckBoxListener());
this.add(one);

実際には、コンストラクターで一時的な「1」を使用しています。これは、クラスの最上位にある「1」と同じではありません。

さて、あなたが電話するとき

if(e.getSource() == one)

これで、クラスの上部にある「1つ」を使用しています。これは、ウィンドウに表示されるチェックボックスではありません。

これが、その「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!
于 2011-02-22T02:40:25.883 に答える
0

この行かどうかを確認しましたか

if(e.getSource()==one){

大丈夫ですか?これを削除してみて、役立つかどうかを確認してください。イベントは、実際のソースでは苦痛になる可能性があります。

于 2011-02-21T19:25:07.140 に答える
0

7番目のチェックボックスを除くすべてのチェックボックスにアクションリスナーを追加する必要があります。これは影響がありません)、リスナーが呼び出されるたびにボタンの有効状態を再計算します。を参照してくださいaddActionListener

于 2011-02-18T18:18:48.200 に答える
0

これを実現するには、関心のあるすべてのケースをチェックし、状態が達成されたときに適切なアクションを実行する1つの方法が必要になります。次に、この1つのワーカーメソッドを呼び出すチェックボックスごとにActionListenerを用意します。

于 2011-02-18T18:19:34.783 に答える