Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 疑难解答:JDialog哪个是模态的,而哪个不是模态的?_Java_Swing_Modal Dialog_Jdialog - Fatal编程技术网

Java 疑难解答:JDialog哪个是模态的,而哪个不是模态的?

Java 疑难解答:JDialog哪个是模态的,而哪个不是模态的?,java,swing,modal-dialog,jdialog,Java,Swing,Modal Dialog,Jdialog,被这个问题难住了,但也许,只是也许,有人以前有过这个问题,可以给我指出正确的方向 我有一个JDialog,用于显示长时间运行的任务的进度,我已将其明确创建为具有定义所有者的模态: progressDialog = new JDialog( ((Dialog)windowParent), true ); ... progressDialog.setVisible( true ); 稍后,任务完成后,我将再次关闭对话框: protected void done() { SwingU

被这个问题难住了,但也许,只是也许,有人以前有过这个问题,可以给我指出正确的方向

我有一个JDialog,用于显示长时间运行的任务的进度,我已将其明确创建为具有定义所有者的模态:

  progressDialog = new JDialog( ((Dialog)windowParent), true );
  ...
  progressDialog.setVisible( true );
稍后,任务完成后,我将再次关闭对话框:

protected void done() {
  SwingUtilities.invokeLater( new Runnable() {
     public void run() {
        progressDialog.setVisible( false );
     }
  } );
}

在非常罕见的情况下,对话框a)不会关闭,b)不是真正的模态,即用户能够与(理论)对话框后面的窗口进行交互。你知道这是什么原因吗?不幸的是,这种情况很少发生,直到现在,只发生在Linux系统上。这可能是一个Swing错误,还是我可能做错了什么?

尽管我无法为您的问题提供一个明确的解决方案,但我可以告诉您,我在Linux上看到了各种模态对话框的奇怪行为,其中许多行为取决于现有的窗口管理器

对于我们的销售点系统,我们最终使用了非常简约的“flwm”窗口管理器,因为它提供了最可靠和最理想的属性。不过,我不建议将其用于现代Linux桌面


至于模态本身:如果您可以使用Java 6,您可能希望了解JDK6模态的更改和增强:以及对话框的附带功能。ModalExclusionType

尽管我无法提供您问题的最终解决方案,我可以告诉你,我在Linux上看到了模态对话框的各种奇怪行为——其中许多都取决于现有的窗口管理器

对于我们的销售点系统,我们最终使用了非常简约的“flwm”窗口管理器,因为它提供了最可靠和最理想的属性。不过,我不建议将其用于现代Linux桌面


至于模态本身:如果您可以使用Java 6,您可能希望了解JDK6模态的更改和增强:以及对话框的附带功能。ModalExclusionType

您真的需要调用器来隐藏ut吗?我猜它已经在EDT上了,因为它很可能是通过GUI调用的。因为设置可见性是一个GUI操作,所以需要在从非EDT线程调用done()后立即将其放入invokeLater()调用中。所以这是一件安全的事情。即使在EDT上被调用也不会受伤。你真的需要调用器来隐藏ut吗?我猜它已经在EDT上了,因为它很可能是通过GUI调用的。因为设置可见性是一个GUI操作,所以需要在从非EDT线程调用done()后立即将其放入invokeLater()调用中。所以这是一件安全的事情。即使在美国东部夏令时也不会受伤。