JOptionPane.showMessageDialog-为什么要分解复选框?

时间:2018-08-24 01:45:05

标签: java swing joptionpane jcheckbox

我非常感兴趣,如何解释这一点,就像黑客一样?还是没有什么可激动的?

也许,当您是一个初学者时,您还有其他一些更有趣的经历?

警告!这不是问题(确实有帮助!),我只是想在代码中寻找更多的意义:)

太简单了:如果声明禁止一个复选框,那么最后一个...

import javax.swing.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

class NotMain {

    public static void main(String[] args) {
        X x = new X();
    }
}
class X implements ItemListener{
    X() {
        JCheckBox jCheckBox[] = new JCheckBox[2];
        JPanel panel = new JPanel();
        JFrame frame = new JFrame();

        jCheckBox[0] = new JCheckBox("1");
        jCheckBox[1] = new JCheckBox("2");
        jCheckBox[0].addItemListener(this);
        jCheckBox[1].addItemListener(this);

        panel.add(jCheckBox[0]);
        panel.add(jCheckBox[1]);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    private int i;
    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {
            i++;
        } else i--;

        if (i == 2) {
                  //if you comment next line, you'll be able to select two checkboxes
            JOptionPane.showMessageDialog(null, "nope.");
        }
    }
}

1 个答案:

答案 0 :(得分:1)

为复选框生成mousePressedmouseReleased事件时,复选框的状态会更改。这很容易演示。只需在复选框上进行mousePressed,然后在释放鼠标之前将鼠标从复选框中拖出即可。状态不会改变。

在您的示例中,该复选框知道已完成mousePressedmouseReleased的操作,因此它生成了itemStateChanged事件,该事件导致显示JOptionPane。

问题是ItemStateChange代码在mouseReleased代码之前执行。现在,执行mouseReleased代码时,选项窗格将变为焦点,因此复选框的状态不会更改。

将代码更改为:

if (i == 2)
{
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
               JOptionPane.showMessageDialog(null, "nope.");
        }
    });
}

现在,选项窗格的显示被添加到Event Dispatch Thread (EDT)的末尾,这意味着在显示JOPtionPane之前,复选框将处理mousePressedmouseReleased事件,因此复选框的状态更改为选中状态。