Swing:如何禁止JFrame/JDialog之外的交互?

问题描述 投票:0回答:3

我想在执行线程时显示进度条并阻止与我的应用程序框架的交互。

在另一个线程中,有人建议使用 JDialog 而不是 JFrame 和

setModal(true)
。但是,这样做时对话框会阻止整个应用程序。

这本质上是我的代码:

 MyDialog dlg = new MyDialog(); 
 dlg.setModal(true); 
 dlg.setVisible(true); 

 //do some stuff....
 //(never executed when setModal(true)

 dlg.setVisible(false); 
java swing jframe jdialog
3个回答
3
投票

这就是模式对话框的要点,“框”之外不会发生任何交互。模式弹出窗口还会在等待用户输入时暂停线程。如果您想在显示对话框时执行其他操作,则必须在对话框本身中执行此操作,或者启动一个新线程来处理它。

希望有帮助!


3
投票

最简单的方法是使用 JXLayer 和 LockableUI。 请参阅此处了解如何完成此操作的示例。

另请注意,JXLayer 已进入 Java 7,并且可用作 javax.swing.JLayer

另一件事是,您不应该在事件调度线程中执行长时间运行的任务。了解 SwingWorker 并学习为 Swing 编写多线程代码


1
投票
使用模态对话框尝试这样的事情:

final JDialog dlg = new JDialog(); dlg.setModal(true); dlg.setSize(500, 500); dlg.addWindowListener(new WindowAdapter() { @Override public void windowActivated(WindowEvent e) { //or other method new Thread(new Runnable() { public void run() { try { //execute your long running task } //you should catch exception finally { dlg.setVisible(false); dlg.dispose(); } } }).start(); } }); dlg.setVisible(true);
我还可以在 JFrame 上设置 GlassPane,它将拦截来自用户的任何事件。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.