如何在Platform.runLater()调用时结束JavaFX线程并终止它们?

时间:2014-03-15 09:10:36

标签: java multithreading javafx

我有一个不在JavaFX应用程序线程中的程序,我想在其中调用一些JavaFX应用程序,以便为我做一些事情。 这是我的代码:

public void extractImages(Document document) {
        ImageExtractor_HTML_Data.getInstance().documentId = document.getId();
        if (!ImageExtractor_HTML_Data.getInstance().started)
            new JFXPanel();
        ImageExtractor_HTML_Data.getInstance().started = true;
        Platform.runLater(new Runnable() {
            ImageExtractor_HTML_Browser browser = new ImageExtractor_HTML_Browser();

            @Override
            public void run() {
                browser.start(new Stage());
            }
        });

        synchronized (ImageExtractor_HTML_Data.getInstance()) {
            try {
                ImageExtractor_HTML_Data.getInstance().wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

我的浏览器类是:

public class ImageExtractor_HTML_Browser extends Application {
    private Scene scene;

    @Override
    public void start(Stage stage) {

        /* Some code */

        stage.setTitle("Web View");
        Browser browser = new Browser(htmlFile, stage);
        scene = new Scene(browser, 750, 500, Color.web("#666970"));
        stage.setScene(scene);
        stage.show();
        browser.imageExtractor(new ImageHandler_DB_HTML(document));
    }

我的imageExtractor方法是:

public void imageExtractor(final ImageHandler handler) {
        webEngine.getLoadWorker().stateProperty()
                .addListener(new ChangeListener<Worker.State>() {
                    @Override
                    public void changed(
                            @SuppressWarnings("rawtypes") ObservableValue observableValue,
                            Worker.State state, Worker.State newState) {
                        if (newState.equals(Worker.State.SUCCEEDED)) {
                            /* Some code which extract some data */
                            synchronized (ImageExtractor_HTML_Data
                                    .getInstance()) {
                                ImageExtractor_HTML_Data.getInstance().notify();
                            }
                            stage.close();
                            Platform.exit();
                            return;
                        }
                    }
                });
    }

在imageExtractor方法中,我想等到我的HTML文件加载完全然后我想要做某事,所以我使用WebEngine.getLoadWorker.etc。 我的问题是,在运行此代码后,我的JavaFX线程没有完成,所以我的程序没有结束。 虽然,我不想使用System.exit(0),因为我的程序运行在通过tomcat运行的项目中间,如果我使用System.exit(0),整个项目都会失败,这根本不好!

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

最后我理解了这个问题。这是因为新的JFXPanel()&#39;我打电话来初始化JavaFX工具包。我在另一个地方叫它,我的代码是正确的! 它是更正后的版本:

public void extractImages(Document document) {
        ImageExtractor_HTML_Data.getInstance().documentId = document.getId();

        Thread javaFxThread = new Thread(new Runnable() {
            @Override
            public void run() {
                new JFXPanel();
                Platform.runLater(new Runnable() {
                    ImageExtractor_HTML_Browser browser = new ImageExtractor_HTML_Browser();

                    @Override
                    public void run() {
                        browser.start(new Stage());
                    }
                });
            }
        });
        javaFxThread.setDaemon(true);
        javaFxThread.start();

        synchronized (ImageExtractor_HTML_Data.getInstance()) {
            try {
                ImageExtractor_HTML_Data.getInstance().wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }