gpt4 book ai didi

java - 多个showMessageDialog可以断swing吗?

转载 作者:太空宇宙 更新时间:2023-11-04 11:24:19 24 4
gpt4 key购买 nike

这是简化的代码,可以通过按主 JFrame 类中的按钮来调用该代码。使用此代码,然后关闭生成的对话框之一,会导致 Java session 中的所有 Activity 窗口锁定或消失。

//Broken code
private void buttonActionPerformed(java.awt.event.ActionEvent evt) {
List<JFrame> frameList = new ArrayList<>();
frameList.add(new TestJFrame());
frameList.add(new TestJFrame());

frameList.forEach(frame -> frame.setVisible(true));

frameList.forEach(frame -> {
SwingUtilities.invokeLater(() -> {
JOptionPane.showMessageDialog(frame, "Msg", "Title", 0);
frame.setVisible(false);
frame.dispose();
});
});
}

但是,如果我要删除 SwingUtilities.invokeLater() 部分,那么它会像我预期的那样工作(弹出对话框,关闭对话框,窗口消失,重复)。

//Working code
private void buttonActionPerformed(java.awt.event.ActionEvent evt) {
List<JFrame> frameList = new ArrayList<>();
frameList.add(new TestJFrame());
frameList.add(new TestJFrame());

frameList.forEach(frame -> frame.setVisible(true));

frameList.forEach(frame -> {
//SwingUtilities.invokeLater(() -> {
JOptionPane.showMessageDialog(frame, "Msg", "Title", 0);
frame.setVisible(false);
frame.dispose();
//});
});
}

我不想使用第二个,因为实际的代码是在通知一组监听器的后台线程中启动的,所以如果我要使用第二个,那么它会阻塞线程并减慢监听器的速度,直到用户响应(当我可以在那段时间进行处理时)。 invokeLater() 让我崩溃了怎么办?这是预期的行为吗?

注意:这是从我实际使用它的方式中提取出来的简化代码,但核心问题仍然存在(我有多个 JFrame ,如果将多个 JOptionPane.showMessageDialog() 放在不同 JFrameinvokeLater() 上,那么它会让我崩溃。我使用在 Netbeans 中创建的新的、独立的 JFrame 类测试了上面的代码,并且能够重现错误。

编辑:我似乎无法在 Windows 中重现该错误,似乎只在 Linux 中发生。

最佳答案

很可能是 invokeLater() 破坏了您的代码。如果您想线程化此操作,请尝试使用简单的线程或

  EventQueue.invokeLater(new Runnable() 
{
public void run()
{ //Your joptionpane here
}
});`

关于java - 多个showMessageDialog可以断swing吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44550826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com