我有一个不在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),整个项目都会失败,这根本不好!
任何人都可以帮助我吗?
答案 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();
}
}
}