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

Multithreading 检测到JavaFX Glass-如何从GUI JavaFX运行代码,multithreading,user-interface,javafx,Multithreading,User Interface,Javafx,我正在创建一个新的javafx应用程序——这是我第一次使用javafx。我正在使用FXML创建GUI,并在此基础上创建一个阶段,如下所示: 我的FXML有一个指向我的主控制器的按钮,单击该按钮时调用handleButton方法: 公共类MainController实现可初始化{ @FXML private void handleButtonAction(ActionEvent event) { System.out.println("You clicked me!");

我正在创建一个新的javafx应用程序——这是我第一次使用javafx。我正在使用FXML创建GUI,并在此基础上创建一个阶段,如下所示:

我的FXML有一个指向我的主控制器的按钮,单击该按钮时调用handleButton方法:

公共类MainController实现可初始化{

@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!");         
}
@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!"); 
    HttpClient client = new HttpClient();        
}
上面的代码工作正常,控制台打印出“您按预期单击了我”。但我想要的是web请求和其他要运行的代码:

公共类MainController实现可初始化{

@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!");         
}
@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!"); 
    HttpClient client = new HttpClient();        
}
当我尝试在我的按钮处理程序中创建HTTP客户端对象时,出现以下错误:

运行:您单击了我!Glass在 -[GlassViewDelegate SendJavaMouseeEvent:]:src/com/sun/mat/ui/GlassViewDelegate.m:541 线程“JavaFX应用程序线程”中出现异常 java.lang.RuntimeException: java.lang.reflect.InvocationTargetException位于 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.dispatchEvent(BasicEventDispatcher.java:37) 在 EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 在 com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) 在 EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 位于com.sun.javafx.event.EventUtil.fireventimpl(EventUtil.java:53) 位于com.sun.javafx.event.EventUtil.firevent(EventUtil.java:28) javafx.event.event.fireEvent(event.java:171)位于 javafx.scene.Node.firevent(Node.java:6863)位于 javafx.scene.control.Button.fire(Button.java:179)位于 com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:193) 在 com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:336) 在 com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:329) 在 com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64) 在 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.dispatchEvent(BasicEventDispatcher.java:37) 在 EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 在 com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) 在 EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 在 com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) 在 EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 位于com.sun.javafx.event.EventUtil.fireventimpl(EventUtil.java:53) 位于com.sun.javafx.event.EventUtil.firevent(EventUtil.java:33) javafx.event.event.fireEvent(event.java:171)位于 javafx.scene.scene$MouseHandler.process(scene.java:3328)位于 javafx.scene.scene$MouseHandler.process(scene.java:3168)位于 javafx.scene.scene$MouseHandler.access$1900(scene.java:3123)位于 javafx.scene.scene.impl_processMouseEvent(scene.java:1563)位于 javafx.scene.scene$ScenePeerListener.mouseEvent(scene.java:2265)位于 com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:250) 在 com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:173) 位于java.security.AccessController.doPrivileged(本机方法) com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:292) 位于com.sun.glass.ui.View.handleMouseEvent(View.java:528) com.sun.glass.ui.View.notifyMouse(View.java:922)

所以我的问题是:

a) 为什么会发生这种情况?为什么在println和变量赋值等简单操作正常的情况下,HTTPClient的创建会抛出这个错误

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


我期待任何帮助!

您需要移动到一个异步HTTP客户机,该客户机可以在收到信息时将信息发送回javaFX线程,UI线程不喜欢被阻止,我建议您查看,或者如果您想更进一步等等。

Hi@fixulate请告诉HTTPClient由您或Apache(或其他人)创建。请看一下JavaFX中的并发: