Как использовать выбор JCheckBoxes для использования? - PullRequest
3 голосов
/ 18 февраля 2011

У меня есть флажок на 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");}
            }
     }}

Ответы [ 5 ]

5 голосов
/ 21 февраля 2011

Я проверил этот простой пример, и он отлично работает (он пишет "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?

4 голосов
/ 22 февраля 2011

Вы можете не осознавать, что на самом деле в вашей программе установлены два флажка!

Я предполагаю, что ваш класс выглядит примерно так:

public class Checklist extends JFrame {
    private JCheckBox one;

    public Checklist() {
        JCheckBox one = new JCheckBox("CT scan performed");
        one.addItemListener(new CheckBoxListener());
        this.add(one);
    }
}

У вас есть две копии "одного"", частный JCheckBox one", который принадлежит Checklist, и "JCheckBox one = ..." в вашем конструкторе.Затем вы заметите, что когда вы вызываете

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

, вы фактически используете временное «одно» в конструкторе, которое НЕ совпадает с «одним» в верхней части вашего класса!

Теперь, когда вы звоните

if(e.getSource() == one)

, вы теперь используете «один» в верхней части вашего класса, который НЕ является флажком, который вы видите в своем окне!

Вот почему удаление этого «JCheckBox» заставляет вашу программу работать - теперь «один» в вашем конструкторе такой же, как «один» в верхней части вашего класса.

Чтобы сделать это более понятным,следующий код - это то, что вы ДЕЙСТВИТЕЛЬНО делаете в своем неработающем примере:

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!
0 голосов
/ 21 февраля 2011

Вы проверили, в порядке ли эта строка

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

?Попробуйте удалить это и посмотреть, поможет ли это.События могут быть проблемой с реальными источниками.

0 голосов
/ 18 февраля 2011

Для этого вам понадобится один метод, который будет проверять все случаи, которые вас интересуют, и предпринимать соответствующие действия при достижении состояния. Затем создайте ActionListener для каждого флажка, который вызывает этот рабочий метод.

0 голосов
/ 18 февраля 2011

Вам необходимо добавить прослушиватель действий на каждый флажок, кроме седьмого (который не оказывает никакого влияния), и повторно вычислять включенное состояние кнопки при каждом вызове прослушивателя.См. addActionListener.

...