Multithreading 检测到JavaFX Glass-如何从GUI JavaFX运行代码
我正在创建一个新的javafx应用程序——这是我第一次使用javafx。我正在使用FXML创建GUI,并在此基础上创建一个阶段,如下所示: 我的FXML有一个指向我的主控制器的按钮,单击该按钮时调用handleButton方法: 公共类MainController实现可初始化{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!");
@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中的并发: