2017-10-21 166 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上使用的按鈕/標籤。我修復了這些進口產品,一切正常。