我需要以下帮助:我在javafx中实现一个应用程序,通过单击一个按钮来调用此应用程序。 问题是当我关闭应用程序时,我无法再次调用它。 我已经读过你不能多次调用Application.launch()方法。 但我在服务类上找到了一些东西。文档页面中的示例不是很清楚。任何人都知道如何做到这一点? 谢谢。
http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
我的代码:
private void jButton1ActionPerformed (java.awt.event.ActionEvent evt) {
WebMap n1 = new WebMap () / / application in javafx
n1.Lunch ();
}
WebMap类:// javafx应用程序
public void Lunch () {
Application.launch ();
}
答案 0 :(得分:1)
您无法在同一进程中多次启动JavaFX应用程序,因此请勿尝试这样做。
你需要找到一种替代机制来做你想做的事情。
如果要在Swing应用程序中嵌入JavaFX场景,则应该在Swing中创建新的JFXPanel,而不是在Swing按钮按下时创建新的JavaFX应用程序。
如果您打算使用纯JavaFX应用程序,则无需使用Swing按钮启动JavaFX应用程序,只需使用JavaFX按钮即可直接显示JavaFX场景。
在这种情况下无需使用服务,Service用于在另一个线程上执行重复的后台任务,这与您正在尝试的内容无关。
如果要集成Swing和JavaFX应用程序,请阅读JavaFX for Swing developers。
答案 1 :(得分:0)
作为com.bitplan.javafx开源项目的提交者,我可以向您介绍我们已经使用了一段时间的变通方法:
WaitableApp.toolkitInit();
将初始化JavaFX环境。
将显示一个示例,说明通常如何使用WaitableApp基类。您可能还想看看项目的Junit测试用例。
WaitableApp
/**
* Waitable Application that does not need launch
*
* @author wf
*
*/
public abstract class WaitableApp extends Application {
protected Stage stage;
static boolean toolkitStarted;
/**
* allow startup without launch
*/
@SuppressWarnings("restriction")
public static void toolkitInit() {
if (!toolkitStarted) {
toolkitStarted = true;
// do not exit on close of last window
// https://stackoverflow.com/a/10217157/1497139
Platform.setImplicitExit(false);
/// https://stackoverflow.com/a/38883432/1497139
// http://www.programcreek.com/java-api-examples/index.php?api=com.sun.javafx.application.PlatformImpl
com.sun.javafx.application.PlatformImpl.startup(() -> {
});
}
}
@Override
public void start(Stage stage) {
this.stage = stage;
}
public Stage getStage() {
return stage;
}
public void setStage(Stage stage) {
this.stage = stage;
}
/**
* wait for close
*
* @throws InterruptedException
*/
public void waitStatus(boolean open) {
int sleep = 1000 / 50; // human eye reaction time
try {
if (open)
while ((stage == null) || (!stage.isShowing())) {
Thread.sleep(sleep);
}
else
while (stage != null && stage.isShowing()) {
Thread.sleep(sleep);
}
} catch (InterruptedException e) {
ErrorHandler.handle(e);
}
}
public void waitOpen() {
waitStatus(true);
}
public void waitClose() {
waitStatus(false);
}
/**
* show me
*/
public void show() {
// ignore multiple calls
if (stage != null)
return;
Platform.runLater(() -> {
try {
this.start(new Stage());
} catch (Exception e) {
ErrorHandler.handle(e);
}
});
}
/**
* close this display
*/
public void close() {
Platform.runLater(() -> {
if (stage != null)
stage.close();
});
this.waitClose();
// allow reopening
stage = null;
}
}