【发布时间】:2017-06-06 09:50:02
【问题描述】:
在我的 java 程序中,我为用户提供了一些选项,其中一个调用 JavaFXProgram 来显示某些内容。我只想在这个被调用的 JavaFX 实际退出时在 Java 程序中运行更多代码,可能需要 5 秒,可能需要一分钟。理想情况下,我想要的是我们在 Android 中的东西。我们拨打startActivityForResult(),然后等待onActivityResult()的电话。
在我的情况下如何实现类似的行为?
我编写了这段代码来尝试复制我遇到的问题。这是类似的想法,但不知何故这会调用 JavaFX,进入循环开始并毫无问题地从用户那里检索输入。在我的另一个程序中,当它再次返回扫描输入时,我总是得到Exception in thread "main" java.util.InputMismatchException。但正如我所说,理想情况下,我只想在 JavaFX 应用程序关闭后运行更多代码。
package JavaCallsJavaFXandWaits;
import java.util.Scanner;
import javafx.application.Application;
public class MyJavaProgram {
public static void main(String[] args) {
int input;
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("0 - exit");
System.out.println("1 - display something to me");
input = scanner.nextInt();
switch (input) {
case 0:
break;
case 1:
Application.launch(JavaCallsJavaFXandWaits.MyJavaFXProgram.class, null);
// how to get notified of MyJavaFXProgram exit? I only want to run code after it exits
break;
}
if (input == 0) break;
}
}
}
package JavaCallsJavaFXandWaits;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class MyJavaFXProgram extends Application {
@Override
public void start(Stage primaryStage) {
Text oText = new Text("My JavaFXProgram");
StackPane root = new StackPane();
root.getChildren().add(oText);
Scene scene = new Scene(root, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
edit1:
我刚刚注意到,如果我尝试显示某些内容两次(例如:选择 1,关闭 JavaFX 应用程序,然后再次选择 1),它会因Exception in thread "main" java.lang.IllegalStateException: Application launch must not be called more than once 而崩溃。似乎 JavaFX 应用程序也没有在此代码中正确退出。
【问题讨论】:
-
这不是你要找的方法
showAndWait()吗? -
不是已经这样做了吗?
Application.launch()在 JavaFX 应用程序退出之前不会返回。而且,一般来说这种方法是行不通的,因为你不能多次调用launch()。 -
为什么要从命令行驱动一个GUI应用程序呢?这样做非常棘手:您必须弄脏一些线程等。为什么不在一个简单的窗口中显示“向我显示某些东西”的选项?
-
@BoHalim
showAndWait()实际上在这里似乎并不能很好地工作(至少不是直接地)。当然,您只能从 FX 应用程序线程调用showAndWait(),并且特别是它必须从事件处理程序或对Platform.runLater()的调用中调用,并且不能在初级阶段被调用。当然,将其提交给Platform.runLater()允许当前代码继续执行。所以你必须用一些中等复杂的线程来做到这一点。 -
@James_D 你是对的
Application.launch()在 JavaFX 退出之前不会返回。我有一个错误正在把事情搞砸,但现在正如你已经说过的那样,我正面临调用launch()的问题不止一次。我不明白为什么这是一个问题。我调用 Application 但它退出了,那么它怎么知道它被调用了两次?有没有办法重置这个?
标签: java javafx wait onactivityresult startactivityforresult