JCheckBox:在 ItemStateChanged 事件中两次显示消息对话框
JCheckBox: showMessageDialog twice in ItemStateChanged event
为什么我的程序在 ItemStateChanged
事件中调用了两次 showMessageDialog
,即使我把它放在 if else 中?
private void checkBox1ItemStateChanged(java.awt.event.ItemEvent evt) {
if(evt.getStateChange() == ItemEvent.SELECTED){
//System.out.println("Check box 1 selected");
JOptionPane.showMessageDialog(null, "Check box 1 selected");
}
else{
//System.out.println("Check box 1 deselected");
JOptionPane.showMessageDialog(null, "Check box 1 deselected");
}
}
如果我只使用 System.out.println
,程序将 运行 正确。
在显示 JOptionPane 之前未更新复选框的状态。 (注意在显示第一个选项窗格时如何不绘制复选标记。
因此,您需要做的是确保在使用 SwingUtilities.invokeLater(...) 显示 JOptionPane 来显示 JOption 窗格之前更新和重新绘制状态:
checkBox.addItemListener( new ItemListener()
{
public void itemStateChanged(java.awt.event.ItemEvent evt)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
if(evt.getStateChange() == ItemEvent.SELECTED)
{
JOptionPane.showMessageDialog(null, "Check box 1 selected");
}
else
{
JOptionPane.showMessageDialog(null, "Check box 1 deselected");
}
}
});
}
});
为什么我的程序在 ItemStateChanged
事件中调用了两次 showMessageDialog
,即使我把它放在 if else 中?
private void checkBox1ItemStateChanged(java.awt.event.ItemEvent evt) {
if(evt.getStateChange() == ItemEvent.SELECTED){
//System.out.println("Check box 1 selected");
JOptionPane.showMessageDialog(null, "Check box 1 selected");
}
else{
//System.out.println("Check box 1 deselected");
JOptionPane.showMessageDialog(null, "Check box 1 deselected");
}
}
如果我只使用 System.out.println
,程序将 运行 正确。
在显示 JOptionPane 之前未更新复选框的状态。 (注意在显示第一个选项窗格时如何不绘制复选标记。
因此,您需要做的是确保在使用 SwingUtilities.invokeLater(...) 显示 JOptionPane 来显示 JOption 窗格之前更新和重新绘制状态:
checkBox.addItemListener( new ItemListener()
{
public void itemStateChanged(java.awt.event.ItemEvent evt)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
if(evt.getStateChange() == ItemEvent.SELECTED)
{
JOptionPane.showMessageDialog(null, "Check box 1 selected");
}
else
{
JOptionPane.showMessageDialog(null, "Check box 1 deselected");
}
}
});
}
});