1

我最小化了我的程序以仅包含问题,并尝试完全按照我从许多示例中理解的方式编写代码。当我使用 时ActionListener,我得到了问题解决。但我想知道为什么使用ItemListener, 复选框不能正确运行。如果我在没有 的情况下运行我的程序ItemListener,它可以正常工作。有了这个ItemListener,checkBox 不会改变状态。

import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class omaJFrame extends JFrame{
    private JCheckBox checkBox1;

    public omaJFrame() {
        super("Window Title");

        TheHandler handler = new TheHandler();
        setLayout(new FlowLayout());

        checkBox1 = new JCheckBox("Checkbox 1");
        add(checkBox1);
        checkBox1.addItemListener(handler); 
    }

    private class TheHandler implements ItemListener {
        String output = "";

        public void itemStateChanged(ItemEvent event) {
            if (event.getItem()==checkBox1)
                output = String.format("%s", checkBox1.isSelected());
            JOptionPane.showMessageDialog(null, output); 
        }
    }
}

import javax.swing.JFrame;
public class EventHandlerMain {
    public static void main(String[] args) {
        omaJFrame window = new omaJFrame();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(350,200);
        window.setVisible(true);
    }
}
4

1 回答 1

1

为我工作。另请注意,Swing GUI 对象应事件分派线程上构建和操作。

import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class OmaJFrame extends JFrame {

    private JCheckBox checkBox1;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                OmaJFrame f = new OmaJFrame();
            }
        });
    }

    public OmaJFrame() {
        super("Window Title");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        TheHandler handler = new TheHandler();
        setLayout(new FlowLayout());
        checkBox1 = new JCheckBox("Checkbox 1");
        add(checkBox1);
        checkBox1.addItemListener(handler);
        pack();
        setLocationByPlatform(true);
        setVisible(true);
    }

    private class TheHandler implements ItemListener {

        String output = "";

        @Override
        public void itemStateChanged(ItemEvent event) {
            if (event.getItem() == checkBox1) {
                output = String.format("%s", checkBox1.isSelected());
            }
            JOptionPane.showMessageDialog(null, output);
        }
    }
}
于 2013-09-11T21:23:45.257 回答