【问题标题】:Waiting for modal dialog to close before execution code in Java在 Java 中执行代码之前等待模式对话框关闭
【发布时间】:2013-12-29 14:45:05
【问题描述】:

我正在使用 Java,在 NetBeans 中使用 Swing,我有主 JFrame 和一些 JDialog 窗口。

我单击一个按钮并创建了 JDialog,但打开此 JDialog 后的所有代码都会立即执行。但我希望它在 JDialog 关闭时执行(JDialog 是模态的,它阻塞主框架但不阻塞它的代码)。

例子:

private void buttonActionPerformed(java.awt.event.ActionEvent evt)    
{                                       
    button.setText("Starting");
    About.main(null);
    button.setText("Ending");
}  

现在:点击按钮后,它会打开 JDialog 并且按钮上的文本是“结束”。

但我想:点击按钮,它应该有文本“开始”,然后应该出现 JDialog,但是现在,在它关闭后,“结束”应该是标题。

怎么做?

【问题讨论】:

  • 什么是About.main(null)??
  • 好吧,当我使用 NetBeans 创建 JDialog 时,它会自动生成一个类和基本代码。它还生成一个静态函数“main”,它实际上创建了一个“About”类的对象。
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 但是很难发布它的简短代码。你想让我在这里粘贴整个“关于”类吗?它只不过是由 NetBeans 生成的。我只想打开一些模式对话框,它会阻止下一个代码执行。例如在 Delphi 模态窗口中就有这种能力。

标签: java swing modal-dialog jdialog


【解决方案1】:

正如您所说,您使用的是 netbeans,当它生成的 main 方法使用 SwingUtilities#invokeLater 包装对象创建时,这意味着此代码将在处理完所有未决 AWT 事件后发生。因此,由于您的System.out.println("end") 是在一个事件中,您的另一个事件将在前一个事件完成后执行!这就是您在控制台打印“结束”中看到的原因。

我不知道使用其他主要方法而不是像普通方法那样为整个应用程序使用主要方法是否是一个好的设计。

IMO 我只是会使用,或制作自己的“构建器”方法,因为 netbeans 生成也会再次设置 L&F。

因此,为了解决您的问题,只需使用或制作您自己的构建器方法,而不用 invokeLater 包装它。

new MyDialog(null,true).setVisible(Boolean.TRUE); //may be not null 1st arg and a Frame or use SwingUtilities.windowForThisComponent(mycomponent);

【讨论】:

  • 谢谢,它有效。你只需要像我一样删除“invokeLater”并使用“main”方法。或者写 About x = new About(this,true); x.setVisible(true);
  • @user3144058 是的,我不会使用 main 方法,因为 main 方法是应用程序的入口点,而您没有那样使用..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2013-12-28
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多