我一直在用JavaFx粉碎我的头......
这适用于没有运行应用程序的实例的情况:
public class Runner {
public static void main(String[] args) {
anotherApp app = new anotherApp();
new Thread(app).start();
}
}
public class anotherApp extends Application implements Runnable {
@Override
public void start(Stage stage) {
}
@Override
public void run(){
launch();
}
}
但是,如果我在另一个应用程序中new Thread(app).start()
,我会得到一个例外,说明我无法进行两次启动。
此外,我的方法由另一个应用程序的观察者调用,如下所示:
@Override
public void update(Observable o, Object arg) {
// new anotherApp().start(new Stage());
/* Not on FX application thread; exception */
// new Thread(new anotherApp()).start();
/* java.lang.IllegalStateException: Application launch must not be called more than once */
}
它位于JavaFX类中,例如:
public class Runner extends Applications implements Observer {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage){
//...code...//
}
//...methods..//
//...methods..//
@Override
public void update(Observable o, Object arg) {
//the code posted above//
}
}
我尝试将ObjectProperties与侦听器一起使用,但它不起作用。我需要以某种方式从java.util.observer的update方法中运行这个新阶段。
欢迎任何建议。感谢。
答案 0 :(得分:24)
应用程序不只是一个窗口 - 它是Process
。因此,每个VM只允许一个Application#launch()
。
如果您想要一个新窗口 - 请创建一个Stage
。
如果你真的想重用anotherApp
类,只需将其包装在Platform.runLater()
@Override
public void update(Observable o, Object arg) {
Platform.runLater(new Runnable() {
public void run() {
new anotherApp().start(new Stage());
}
});
}
答案 1 :(得分:1)
我在主类AnotherClass ac = new AnotherClass();
中做了另一个JFX类的构造函数,然后调用了方法ac.start(new Stage);
。它对我很好。 U可以将其放在main()或其他方法中。 launch(args)方法可能会做同样的事情
答案 2 :(得分:0)
希望提供第二个答案,因为有一点需要注意使用
Application.start(阶段阶段)。
在init方法返回后调用start方法
如果您的JavaFX应用程序具有覆盖Application.init(),则该代码永远不会执行。您在第二个应用程序主方法中没有任何代码。
启动第二个JavaFX应用程序的另一种方法是使用ProcessBuilder API启动新进程。
final String javaHome = System.getProperty("java.home");
final String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
final String classpath = System.getProperty("java.class.path");
final Class<TestApplication2> klass = TestApplication2.class;
final String className = klass.getCanonicalName();
final ProcessBuilder builder = new ProcessBuilder(javaBin, "-cp", classpath, className);
final Button button = new Button("Launch");
button.setOnAction(event -> {
try {
Process process = builder.start();
} catch (IOException e) {
e.printStackTrace();
}
});