2017-10-21 92 views
0

如何更改JavaFX场景中标签的值?我试图找出一种方法来改变按钮点击时标签的文本值,但它不起作用。 我已经成立了一个外汇:身份证的按钮和标签,并设置其控制器(CPCS305_JAVAFX_FXML,类本身的按钮也链接到handleButtonAction2()函数JavaFX - 如何在场景中编辑/使用变量

public class CPCS305_JAVAFX_FXML extends Application { 

@FXML 
Scene scene; 
Stage stage; 
Label main_label 
Button login_button; 
AnchorPane root; 

@Override 
public void start(Stage stage) throws Exception { 
    root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 
    scene = new Scene(root); 
    stage.setScene(scene); 
    stage.show(); 

@FXML 
private void handleButtonAction2(ActionEvent event) throws IOException, Exception { 
    main_label.setText("Hello World"); 
} 

public static void main(String[] args) { 
    launch(args); 
}} 

错误报告是这样的:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774) 
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.Node.fireEvent(Node.java:8413) 
at javafx.scene.control.Button.fire(Button.java:185) 
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) 
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) 
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) 
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417) 
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416) 
at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
at com.sun.glass.ui.View.notifyMouse(View.java:937)Caused by: java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) 
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) 
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769) 
... 45 moreCaused by: java.lang.NullPointerException 
at cpcs305_javafx_fxml.CPCS305_JAVAFX_FXML.handleButtonAction2(CPCS305_JAVAFX_FXML.java:64) 
... 55 more 

我有自己的控制器,功能2个其他FXML文件,但我要走了,对于后来我想解决不能够communi的问题。美食在一个场景中,然后移动到多个场景。

新学习者的任何想法?

编辑:FXML文件该类 http://textuploader.com/d4wgi

EDIT2:固定。问题与错误的进口。对不起,每个人都遇到麻烦,但感谢您的支持。

回答

0

您需要使用@FXML注释每个实例字段以使其由FXML加载程序分配。如果不这样做,值将保持null。另外,FXML加载器需要知道哪个对象是控制器。您已经在FXML中指定了fx:controller="cpcs305_javafx_fxml.CPCS305_JAVAFX_FXML",但这意味着FXMLLoader将创建班级的第二个实例,因为它可以将其连接到当前班级。你可以通过指定一个带有setController的控制器,setControllerFactory的控制器工厂,或者通过将参数传递给采用静态函数的更多参数之一来实现。

由于您已经在FXML中定义了类,因此您需要使用控制器工厂。 FXML加载器将要求控制器工厂实例化它作为参数提供的类的对象。因为您想要使用已经实例化的类,只需简单地忽略类参数并返回this

public class CPCS305_JAVAFX_FXML extends Application { 
    @FXML // because there is a fx:id="main_label" in the FXML 
    private Label main_label; // Java naming convention would be mainLabel 

    @FXML // because there is a fx:id="login_button" in the FXML 
    private Button login_button; // Java naming convention would be loginButton 

    @Override 
    public void start(Stage stage) throws Exception { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml")); 
     loader.setControllerFactory(controllerClass -> this); // 'this' object will be the controller. 
     Parent root = loader.load(); 
     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    @FXML // because there is a onAction="#handleButtonAction" in the FXML 
    private void handleButtonAction() { // parameter is optional 
     main_label.setText("Hello World"); 
    } 
} 
+0

我按照你的步骤做了你的建议,但它仍然不起作用。它现在不运行,它在错误报告的两行中说: “由于:java.lang.RuntimeException:应用程序启动方法中的异常” 和 “引起的:java.lang.ClassCastException:javafx。 scene.layout.AnchorPane不能转换为javafx.fxml.FXMLLoader“ –

0

@FXML注释应该只位于FXML文件中定义的元素之上,比如标签,按钮和anchorpane。

试一试让我们来看看。

+0

我试着从@FXML中取出Scene和Stage,并按照建议将它们定义在顶部,但它导致了一个“java.lang.reflect.InvocationTargetException”。 –

0

我曾经使用错误的导入为我在Scene Builder上使用的按钮/标签。我修复了这些进口产品,一切正常。