当我显示有关statechange的对话框时,JCheckbox会两次更改状态,该如何解决?

| 我有一个复选框,当用户选择它时,应生成一个包含更多信息的对话框,并在用户做出反应后做一些事情。我的代码基本上是这样的:
private void onItemStateChanged(java.awt.event.ItemEvent evt) {
    System.out.println(\"STATE CHANGED!\");//TODO debug code
    if (evt.getStateChange() == ItemEvent.SELECTED) {
        int returnVal = JOptionPane.showConfirmDialog(this, \"blablatext\");
        if (returnVal == JOptionPane.OK_OPTION) {
            this.field1TF.setText(\"\");
            this.field1TF.setEditable(false);
            this.field2TF.setText(\"\");
            this.filed2TF.setEditable(false);
        }else if(returnVal == JOptionPane.NO_OPTION){
            this.field1TF.setText(\"\");
            this.field1TF.setEditable(false);
            this.field2TF.setText(\"\");
            this.field2TF.setEditable(false);
        }
    } else if(evt.getStateChange() == ItemEvent.DESELECTED){
        this.field1TF.setEditable(true);
        this.field2TF.setEditable(true);
    }
}
现在的问题是,当我单击复选框时,它的状态始终更改两次。 它在某种程度上与JOptionPane.showConfirmDialog有关,因为如果我将其注释掉,它将按预期工作。 我是否不知道我应该在这里简单关注的事情,或者我该怎么做才能获得想要的反应? (用户单击复选框->被问到一个问题->选择是/否/取消->程序相应地动作)     
已邀请:
将其更改为ActionListener JCheckBox http://download.oracle.com/javase/tutorial/uiswing/components/button.html#checkbox ActionListener http://download.oracle.com/javase/tutorial/uiswing/events/actionlistener.html     
eeerggrrhh,您必须查看ItemListener,并使用此演示....
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/** @see http://stackoverflow.com/questions/5806712 */
public class ComponentEventDemo extends JPanel
    implements ActionListener, ComponentListener, ItemListener {

    private static final long serialVersionUID = 1L;
    private JFrame frame;
    private JTextArea display;
    private JLabel label;
    private String newline = \"\\n\";
    private JTextField field1TF;
    private JTextField field2TF;
    private JCheckBox checkbox;

    public ComponentEventDemo() {
        super(new BorderLayout());
        display = new JTextArea();
        display.setEditable(false);
        JPanel panel = new JPanel(new GridLayout(0, 4));
        field1TF = new JTextField();
        field1TF.setDisabledTextColor(Color.red);
        field2TF = new JTextField();
        field2TF.setDisabledTextColor(Color.red);
        label = new JLabel(\"This is a label\", JLabel.CENTER);
        label.addComponentListener(this);
        checkbox = new JCheckBox(\"Label visible\", true);
        checkbox.addActionListener(this);
        checkbox.addComponentListener(this);
        checkbox.addItemListener(this);
        panel.add(checkbox);
        panel.add(label);
        panel.add(field1TF);
        panel.add(field2TF);
        panel.addComponentListener(this);
        JScrollPane scrollPane = new JScrollPane(display);
        scrollPane.setPreferredSize(new Dimension(650, 200));
        frame = new JFrame(\"ComponentEventDemo\");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.add(panel, BorderLayout.SOUTH);
        frame.addComponentListener(this);
        frame.setLocation(200, 200);
        frame.pack();
        frame.setVisible(true);
    }

    public void itemStateChanged(ItemEvent evt) {
        System.out.println(\"STATE CHANGED!\");//TODO debug code
        if (evt.getStateChange() == ItemEvent.SELECTED) {
            int returnVal = JOptionPane.showConfirmDialog(frame, \"blablatext\");
            if (returnVal == 0) {
                field1TF.setText(\"SELECTED - OK btn\");
                field1TF.setEditable(false);
                field2TF.setText(\"SELECTED - OK btn\");
                field2TF.setEditable(false);
            } else if (returnVal == 1) {
                field1TF.setText(\"SELECTED - canc btn\");
                field1TF.setEditable(true);
                field2TF.setText(\"SELECTED - canc btn\");
                field2TF.setEditable(true);
            }
        } else if (evt.getStateChange() == ItemEvent.DESELECTED) {
            field1TF.setEditable(true);
            field1TF.setText(\"DESELECTED\");
            field2TF.setEditable(true);
            field2TF.setText(\"DESELECTED\");
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        boolean selected = checkbox.isSelected();
        System.out.println(\"Checkbox \"
            + (selected ? \"is\" : \"is not\") + \" selected.\");
            if (selected) {
                //some stuff
            } else {
                //some reversal stuff
            }
    }

    protected void displayMessage(String message) {
        display.append(message + newline);
        display.setCaretPosition(display.getDocument().getLength());
    }

    @Override
    public void componentHidden(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + \" --- Hidden\");
    }

    @Override
    public void componentMoved(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + \" --- Moved\");
    }

    @Override
    public void componentResized(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + \" --- Resized \");
    }

    @Override
    public void componentShown(ComponentEvent e) {
        displayMessage(e.getComponent().getClass().getName() + \" --- Shown\");

    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                ComponentEventDemo ced = new ComponentEventDemo();
            }
        });
    }
}
    
添加一个ItemListener并检查isSelected是否对我有用:
        checkbox.addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if(checkbox.isSelected()){
                        System.out.println(checkbox.getText() + \" ++ \" + checkbox.isSelected());
                        //do stuff
                    }else{
                        System.out.println(checkbox.getText() + \" -- \" + checkbox.isSelected());
                        //do other stuff
                    }

                }
        });
    

要回复问题请先登录注册