首页 文章

检测到JavaFX Glass - 如何从GUI Javafx运行代码

提问于
浏览
1

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

public void start(Stage stage)抛出Exception {

父root = FXMLLoader.load(getClass() . getResource(“Main.fxml”));
场景场景=新场景(根);
stage.setScene(场景);
stage.show();
}

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

public class MainController实现Initializable {@FXML
private void handleButtonAction(ActionEvent event){
System.out.println(“你点击了我!”);
}

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

public class MainController实现Initializable {@FXML
private void handleButtonAction(ActionEvent event){
System.out.println(“你点击了我!”);
HttpClient client = new HttpClient();
}

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

跑:你点击了我! Glass在 - [GlassViewDelegate sendJavaMouseEvent:]检测到杰出的Java异常:src / com / sun / mat / ui / GlassViewDelegate.m:541线程“JavaFX Application Thread”中的异常java.lang.RuntimeException:java.lang.reflect.InvocationTargetException at javafx.fxml.FXMLLoader $ ControllerMethodEventHandler.handle(FXMLLoader.java:1440)at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager . java:217)com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)at com.sun.javafx.event位于com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)的.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)at com.sun.javafx.event.EventUtil.fireEvent (EventUtil.java:28)在javafx.svent.Event.fireEvent(Node.java:6863)的javafx.event.Event.fireEvent(Event.java:171)javafx.scene.control.Button.fire(Button . java:179)at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:193)at com.sun.javafx.scene.control.skin.SkinBase $ 4.handle(SkinBase.java:336 )com.sun.javafx中的com.sun.javafx.scene.control.skin.SkinBase $ 4.handle(SkinBase.java:329)com.sun.javafx上的com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64)位于com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)的.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)位于com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher) .java:38)位于com.sun.javafxx的com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) . event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)at com.sun.javafx.event.EventUtil.fireEvent (EventUtil.java:33)位于javafx.scene.Scene的javafx.event.Event.fireEvent(Event.java:171)javafx.scene.Scene $ MouseHandler.process(Scene.java:3328)$ MouseHandler.process( Scene.java:3168)at javafx.scene.Scene $ MouseHandler.access $ 1900(Scene.java:3123)at javafx.scene.impl_processMouseEvent(Scene.java:1563)at javafx.scene.Scen e $ ScenePeerListener.mouseEvent(Scene.java:2265)at com.sun.javafx.tk.quantum.GlassViewEventHandler $ MouseEventNotification.run(GlassViewEventHandler.java:250)at com.sun.javafx.tk.quantum.GlassViewEventHandler $ MouseEventNotification . 在com.sun.glass.ui的com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:292)的java.security.AccessController.doPrivileged(Native Method)中运行(GlassViewEventHandler.java:173) . View.handleMouseEvent(View.java:528)at com.sun.glass.ui.View.notifyMouse(View.java:922)

所以我的问题是:

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

b)在javafx中处理按钮点击的正确方法是什么 - 在摆动中我会使用SwingWorker来使核心应用程序远离GUI工作 .

我期待着任何帮助!

1 回答

  • 2

    您需要转移到异步HTTP客户端,该客户端可以将信息发送回收到的javaFX线程,UI线程会被阻止,我建议您查看Task Runners of JavaFX或者如果您想进一步了解CompletableFuture和这样 .

相关问题