2017-06-24 3 views
1

Also versuche ich eine JavaFX GUI zu erstellen. Ich habe eine Schaltfläche auf dem Bildschirm hinzugefügt und einen Controller eingerichtet, mit dem ich auf die Schaltfläche zugreifen und den Text der Schaltfläche ausgeben möchte. Hier ist der Code:NullPointerException beim Versuch, JavaFX-GUI-Komponenten im Controller zu ändern

Die FXML:

... 
    <children> 
     <Button fx:id="btnSubmit" layoutX="321.0" layoutY="185.0" mnemonicParsing="false" onMouseClicked="#graphClick" text="Submit" /> 
    </children> 
... 


Der Regler:

public class GraphController implements Initializable { 

private Button btnSubmit; 

public void graphClick() { 
    System.out.println(btnSubmit.getText()); 
} 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    System.out.println("hello"); 

} 

Die Treiberklasse:

public class Graph extends Application { 
    public static void main(String[] args) { 
     launch(args); 

    } 

    public static Stage stage; 

    @Override 
    public void start(Stage stage) throws Exception { 
     Graph.stage = stage; // initialize value of stage. 
     Parent root = FXMLLoader.load(getClass().getResource("MeansGUI.fxml")); 
     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.show(); 

     stage.setResizable(false); 
    } 
} 

Und schließlich der Fehler:

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:54) 
    at javafx.event.Event.fireEvent(Event.java:198) 
    at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470) 
    at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3766) 
    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) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at sun.reflect.misc.Trampoline.invoke(Unknown Source) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at sun.reflect.misc.MethodUtil.invoke(Unknown Source) 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771) 
    ... 31 more 
Caused by: java.lang.NullPointerException 
    at gui.GraphController.graphClick(GraphController.java:26) 
    ... 41 more 

der Konsole ausgegeben, was ich bisher verstanden habe, ist, dass die Schaltfläche - btnSubmit - null, aber ich bin nicht sicher, wie man es macht nicht Null.

Auch die Initialisierungsmethode funktioniert.

Kann mir bitte jemand in die richtige Richtung zeigen?

Vielen Dank,

+0

Siehe https://stackoverflow.com/questions/30210170/is-fxml-needed-for-every-declaration –

Antwort

1

Privat Felder können nicht durch die FXML loader zugegriffen werden. Wenn Sie es wirklich privat benötigen, können Sie @FXML Annotation verwenden, die Java-Reflektion verwendet, um auf privates Feld zuzugreifen.

Entweder verwenden

public Button btnSubmit; 

oder

@FXML 
private Button btnSubmit; 
+0

Ja, das schien habe gearbeitet. Danke (Ich werde es als die Antwort markieren, wenn möglich) –

+0

Sie sind willkommen. Sie können es jetzt markieren. Klicken Sie einfach auf das Häkchen. –

Verwandte Themen