Java 在ItemListener中显示消息对话框可防止选中复选框
我注意到,在选择复选框时,如果在Java 在ItemListener中显示消息对话框可防止选中复选框,java,swing,messagebox,event-dispatch-thread,Java,Swing,Messagebox,Event Dispatch Thread,我注意到,在选择复选框时,如果在itemstener中使用消息框,将阻止复选框被选中。下面是一个完整的示例,演示了该问题: import javax.swing.*; import static java.awt.event.ItemEvent.SELECTED; import static javax.swing.JOptionPane.INFORMATION_MESSAGE; import static javax.swing.JOptionPane.showMessageDialog;
itemstener
中使用消息框,将阻止复选框被选中。下面是一个完整的示例,演示了该问题:
import javax.swing.*;
import static java.awt.event.ItemEvent.SELECTED;
import static javax.swing.JOptionPane.INFORMATION_MESSAGE;
import static javax.swing.JOptionPane.showMessageDialog;
public class ExampleFrame extends JFrame
{
private ExampleFrame()
{
JCheckBox jCheckBox = new JCheckBox("Fail");
add(jCheckBox);
jCheckBox.addItemListener(itemEvent ->
{
int stateChange = itemEvent.getStateChange();
if (stateChange == SELECTED)
{
showMessageDialog(rootPane,
"The checkbox selection did not work.",
"SSCCE",
INFORMATION_MESSAGE);
}
});
}
public static void main(String[] arguments)
{
ExampleFrame exampleFrame = new ExampleFrame();
exampleFrame.pack();
exampleFrame.setVisible(true);
}
}
如果要修复此代码,使其显示消息框而不中断选中复选框,最佳做法是什么
我成功地使用了一个额外的线程来执行侦听器,将其延迟100毫秒,然后在EDT
上再次执行消息框。不过,这似乎太老套了,不被认为是一个合适的解决方案
问题是相关的,但没有得到一个像样的答案。用
SwingUtilities围绕模态对话框。invokeLater
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
showMessageDialog(rootPane,
"The checkbox selection did not work.",
"SSCCE",
INFORMATION_MESSAGE);
}
});