JOptionPane.showMessageDialog - 为什么要分解复选框?
JOptionPane.showMessageDialog - Why breaking down checkboxes?
我很感兴趣,这怎么解释,这就像hack?还是没有什么好兴奋的?
也许,当你是初学者的时候,你还有其他一些更有趣的经历?
警告!这不是问题(真的很有帮助!),我只是在我的代码中寻找更多意义:)
Sooo,简而言之:最后一个 if 语句禁止一个复选框...
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.");
}
}
}
当为复选框生成 mousePressed
和 mouseReleased
事件时,复选框的状态会发生变化。这很容易证明。只需在复选框上执行 mousePressed
,然后在释放鼠标之前将鼠标拖离复选框。状态不变。
在您的示例中,复选框知道 mousePressed
和 mouseReleased
已完成,因此它生成 itemStateChanged
事件,导致显示 JOptionPane。
问题是 ItemStateChange
代码在 mouseReleased
代码之前执行。现在,当执行 mouseReleased
代码时,选项窗格具有焦点,因此复选框的状态没有改变。
将您的代码更改为:
if (i == 2)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
JOptionPane.showMessageDialog(null, "nope.");
}
});
}
现在选项窗格的显示被添加到 Event Dispatch Thread (EDT)
的末尾,这意味着 mousePressed
和 mouseReleased
事件都由 JOPtionPane 之前的复选框处理显示,所以复选框的状态变为选中。
我很感兴趣,这怎么解释,这就像hack?还是没有什么好兴奋的?
也许,当你是初学者的时候,你还有其他一些更有趣的经历?
警告!这不是问题(真的很有帮助!),我只是在我的代码中寻找更多意义:)
Sooo,简而言之:最后一个 if 语句禁止一个复选框...
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.");
}
}
}
当为复选框生成 mousePressed
和 mouseReleased
事件时,复选框的状态会发生变化。这很容易证明。只需在复选框上执行 mousePressed
,然后在释放鼠标之前将鼠标拖离复选框。状态不变。
在您的示例中,复选框知道 mousePressed
和 mouseReleased
已完成,因此它生成 itemStateChanged
事件,导致显示 JOptionPane。
问题是 ItemStateChange
代码在 mouseReleased
代码之前执行。现在,当执行 mouseReleased
代码时,选项窗格具有焦点,因此复选框的状态没有改变。
将您的代码更改为:
if (i == 2)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
JOptionPane.showMessageDialog(null, "nope.");
}
});
}
现在选项窗格的显示被添加到 Event Dispatch Thread (EDT)
的末尾,这意味着 mousePressed
和 mouseReleased
事件都由 JOPtionPane 之前的复选框处理显示,所以复选框的状态变为选中。