2016-07-26 49 views
0

Hallo an alle, ich versuche JavaFX zu lernen.Wie würde ich etwas in einer FXML-Datei in Main referenzieren?

IS gibt es sowieso Ich kann einen dieser Knoten oder Elemente aus der main.java Datei ändern. Wie würde ich LowTextField Text aus der Datei main.java ändern?

Ich versuche mit
lowTextField.setText ("noch lernen"); in der Startmethode und das löst Arten von Fehlern aus. Null Pointers etc. Was macht da, weil ich einfach nicht weiß, wie man dieses Textfeld aus der fxml in main java referenziert. Wie würde ich das machen?

Dies ist der Haupt:

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
      Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
    primaryStage.setTitle("Hello World"); 
    primaryStage.setScene(new Scene(root, 300, 275)); 
    primaryStage.show(); 

     lowTextField.setText("This is The Console"); //<<this des not work 


    } 


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

Diese Datei mein Controller ist. Es tut jetzt nichts, aber ich verstehe, dass die Steuerung für Aktionen, Eingänge usw.

  public class Controller{ 

@FXML Button toolBarBtn1; 
@FXML Button toolBarBtn2; 
@FXML TextField lowTextField; 
@FXML public BorderPane Root; 

    } 

weiß, daß ich es wirklich etwas einfach, dass ich tue, aber ich versuche nur, um eine Idee zu bekommen.

Ich würde wirklich jede Hilfe zu schätzen wissen.

Antwort

0

Idealerweise würden Sie nicht direkt ändern möchten ein Feld in einer anderen Klasse. Erstellen Sie in Ihrer Controller-Klasse stattdessen Setter und Getter, um die Felder zu bearbeiten. Hier

ist eine Probe von dem, was Sie in Controller.java platzieren können:

public void setLowTextField (String text) { 
    this.lowTextField.setText(text); // Calls the setText() method of the local TextField 
} 

Dann in Ihrer Main.java Datei, rufen Sie diese Methode, nachdem der Controller erstellt wurde.

FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); 

// You first need to create a reference to your controller 
Controller controller = new Controller(); 
loader.setController(controller); 

Parent root = loader.load() 

// Now call the setter from the Controller.java file: 
controller.setLowTextField("This is The Console"); 

primaryStage.setTitle("Hello World"); 
primaryStage.setScene(new Scene(root, 300, 275)); 
primaryStage.show(); 

Dies ist eine gute Praxis, wie Sie Ihre @FXML Variablen in Controller.java als privat deklarieren können, aber sie immer noch von der Hauptklasse zugreifen.

+0

Sie müssen den Controller auf der 'FXMLLoader'-Instanz und nicht auf dem' Parent' setzen. ('Parent' hat keine' setController (...) 'Methode.) –

+0

Ah, hoppla! Ich habe meine Antwort korrigiert. Danke, @James_D – Zephyr

+0

Und Sie müssen 'setController()' auch aufrufen, bevor Sie 'load()' aufrufen, sonst werden die Felder nicht injiziert ... –

1

Wenn Sie eine initialize() Methode in der Steuerung definieren, wird sie nach den @FXML -annotated Felder aufgerufen werden injiziert, so dass man sie dort zugreifen:

public class Controller{ 

    @FXML Button toolBarBtn1; 
    @FXML Button toolBarBtn2; 
    @FXML TextField lowTextField; 
    @FXML BorderPane Root; 

    public void initialize() { 
     lowTextField.setText("This is The Console"); 
    } 

}