1

我正在创建一个新的 javafx 应用程序——我第一次使用 javafx。我正在使用 FXML 创建 GUI 并从中创建一个阶段,如下所示:

public void start(Stage stage) throws Exception {

    Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));        
    Scene scene = new Scene(root);        
    stage.setScene(scene);
    stage.show();
}

我的 FXML 有一个指向我的 MainController 的按钮,单击它会调用 handleButton 方法:

公共类 MainController 实现 Initializable {

@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!");         
}

上面的代码工作正常,控制台打印出“你按预期点击了我”。但我想要的是一个网络请求和其他要运行的代码:

公共类 MainController 实现 Initializable {

@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!"); 
    HttpClient client = new HttpClient();        
}

当我尝试在我的按钮处理程序中创建 HTTP 客户端对象时,我收到以下错误:

跑:你点击了我!Glass 在 -[GlassViewDelegate sendJavaMouseEvent:]:src/com/sun/mat/ui/GlassViewDelegate.m:541 线程“JavaFX 应用程序线程”java.lang.RuntimeException:java.lang.reflect.InvocationTargetException 中检测到未解决的 Java 异常javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1440) 在 com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69) 在 com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager. java:217) 在 com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170) 在 com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38) 在 com.sun.javafx.event .BasicEventDispatcher。

所以我的问题是:

a) 为什么会这样?为什么当像 printlns 和变量赋值这样简单的事情正常工作时,HTTPClient 的创建会引发此错误。

b) 在 javafx 中处理按钮点击的正确方法是什么 - 在 swing 中,我将使用 SwingWorker 来完成远离 GUI 的核心应用程序工作。

我期待任何帮助!

4

1 回答 1

2

您需要移动到一个异步 HTTP 客户端,该客户端可以将收到的信息发送回 javaFX 线程,UI 线程不喜欢被阻塞,我建议您查看 JavaFX 的 Task Runners或者如果您想稍微了解一下进一步CompletableFuture等。

于 2017-10-22T05:48:17.290 回答