在 ItemListener 中显示消息对话框会阻止选择复选框
Showing message dialog in ItemListener prevents checkbox selection
我注意到在选择复选框时在 ItemListener
中使用消息框时,会阻止复选框被选中。这是一个演示问题的完整示例:
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
上再次执行消息框。这似乎太老套了,不能被认为是一个合适的解决方案。
This 问题是相关的,但没有得到像样的答案。
用 SwingUtilities.invokeLater
环绕您的模态对话框
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
showMessageDialog(rootPane,
"The checkbox selection did not work.",
"SSCCE",
INFORMATION_MESSAGE);
}
});
我注意到在选择复选框时在 ItemListener
中使用消息框时,会阻止复选框被选中。这是一个演示问题的完整示例:
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
上再次执行消息框。这似乎太老套了,不能被认为是一个合适的解决方案。
This 问题是相关的,但没有得到像样的答案。
用 SwingUtilities.invokeLater
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
showMessageDialog(rootPane,
"The checkbox selection did not work.",
"SSCCE",
INFORMATION_MESSAGE);
}
});