Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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
尽管我设置了Platform.setImplicitExit(true),JavaFX线程并没有死?_Java_Multithreading_Swing_Javafx - Fatal编程技术网

尽管我设置了Platform.setImplicitExit(true),JavaFX线程并没有死?

尽管我设置了Platform.setImplicitExit(true),JavaFX线程并没有死?,java,multithreading,swing,javafx,Java,Multithreading,Swing,Javafx,在我的应用程序中,我使用了javafx.stage.FileChooser,因此javafx线程将启动。 对于我的帧我将默认的关闭操作设置为WindowConstants。在关闭时释放。 当用户退出应用程序时,所有GUI都将消失,但应用程序将继续运行,因为JavaFX线程仍然处于活动状态。有趣的是,我设置了Platform.setImplicitExit(true)。 函数的文档中说:“如果此属性为true,则当最后一个窗口关闭时,JavaFX运行时将隐式关闭;”,但这并没有发生。 通过在关闭时

在我的应用程序中,我使用了javafx.stage.FileChooser,因此javafx线程将启动。 对于我的帧我将默认的关闭操作设置为WindowConstants。在关闭时释放。 当用户退出应用程序时,所有GUI都将消失,但应用程序将继续运行,因为JavaFX线程仍然处于活动状态。有趣的是,我设置了Platform.setImplicitExit(true)。 函数的文档中说:“如果此属性为true,则当最后一个窗口关闭时,JavaFX运行时将隐式关闭;”,但这并没有发生。 通过在关闭时将默认关闭操作设置为WindowConstants.EXIT\u或使用javax.swing.JFileChooser而不是FileChooser,可以解决此问题我已经修复了它,但是我很感兴趣并且想了解为什么JavaFX线程没有关闭,即使我设置了隐式退出并且没有打开任何东西。

下面是一个小示例程序(单击按钮->关闭文件选择器->关闭应用程序):

我刚刚做了这个小测试,程序没有结束,同样是因为JavaFX线程

public class Main {

    public static void main(String[] args) {
        new JFXPanel();
        Platform.setImplicitExit(true);
        Platform.runLater(()->{
            FileChooser fc = new FileChooser();
            fc.showOpenDialog(null);
        });
    }

}

像这样混合使用Swing和JavaFX是不可取的。在具有等待/通知机制的UI线程上放置同步块也是不可取的。只要去掉所有的同步,用Swing或JavaFX重写整个过程,我就是这么做的。我重写了所有内容以使用swing组件。我刚刚对这个问题做了一个编辑,在新的例子中,程序再次永不消亡@如果这不是纯JavaFX应用程序的标准结构,那么这样的应用程序将进行扩展。如果您引入JFXPanel(我不建议大多数程序使用它),那么您马上就有了一个混合的JavaFX/Swing应用程序,这种beast的最小复杂结构可以在.JFileChooser的示例3-1中找到,它可以创建隐式帧。您可能想阅读我的答案,了解一个稍微不同的问题,但它也可能解决您的问题:您的两个示例类实际上都允许平台为我退出。Mac OS X 10.9.5上的JDK 1.8.060。但正如其他评论中所指出的,这实际上并不是一个推荐的用例。
public class Main {

    public static void main(String[] args) {
        new JFXPanel();
        Platform.setImplicitExit(true);
        Platform.runLater(()->{
            FileChooser fc = new FileChooser();
            fc.showOpenDialog(null);
        });
    }

}