2017-10-09 12 views
0

Ich bin neu in javaFx, und ich habe nur innerhalb der Funktion @fxml und initialize das @fxml-Feld nicht Null sein, sonst wird das @ fxml Feld immer Null sein, ist es wahr? Wenn ja, wie kann ich sofort ein @fxml Feld verwenden, nachdem ich eine fxml laden (nicht-Lookup verwenden), genau wie das?JavaFx-wenn fxml Objektfeld injizieren?

@FXML Label resultTF; 
    .... 
    FXMLLoader loader=new FXMLLoader(); 
    loader.setController(this); 

    Parent pane = loader.load(getClass().getResource("/fxml/Main.fxml")); 
    this.resultTF.setText(""); 

Alles, was ich will (der Code folgen wird eine Null-Ausnahme auslösen) zu do ist ein Feld mit ID in der fxml zu deklarieren, und verwenden Sie es sofort nach dem Laden der fxml, etwas wie wpf, flex

+0

Sorry, Es ist ein Fehler, ich habe den Code – BlackCat

+0

Ok, ich konw, was jetzt geschehen, die Lastmethode, die ich aufrufen, ist eine statische Methode.Weil es den gleichen Namen mit der nicht statischen Last hat, also tat ich nicht realisiere das, also denke ich, dass Java statische Methode von einer Instanz aufrufen kann, ist ein schlechtes Design :) – BlackCat

Antwort

2

Sie rufen die statische FXMLLoader.load(URL) Methode.

Da es eine statische Methode ist, weiß es nichts über die Instanz, die Sie zum Aufrufen verwenden (was ohnehin eine schlechte Übung ist; Ihre IDE sollte eine Warnung dazu ausgeben). Insbesondere hat es keinen Controller festgelegt.

Sie müssen eine instance load() method aufrufen, z.

FXMLLoader loader=new FXMLLoader(); 
loader.setController(this); 
loader.setLocation(getClass().getResource("/fxml/Main.fxml")); 

Parent pane = loader.load(); 
+0

Wow, ich habe nicht erkannt, dass es eine statische Methode war, weil sie den gleichen Namen mit der Objektmethode haben. – BlackCat

+0

vielen Dank – BlackCat

+0

@BlackCat Ja, es ist kein besonders gutes API-Design; Aber wie gesagt, deine IDE sollte dies markieren und vorschlagen, dass du sie in das Äquivalent 'FXMLLoader.load (getClass(). getResource (...))' änderst. –

-1

Sie können den Controller in der FXML-Datei angeben. Der FXMLLoader initialisiert die Variablen im Controller. In diesem Fall gibt es kein Problem mit Ihrem Code. Es empfiehlt sich, den Controller von der Hauptklasse zu trennen.

+1

Es gibt nichts im OP, das vorschlägt, dass der Controller der Hauptklasse gleich ist. Es gibt viele Muster, in denen Sie die FXML vom Controller laden würden, z. siehe https://docs.oracle.com/javase/9/docs/api/javafx/fxml/doc-files/introduction_to_fxml.html#custom_components –

+0

Der Code vermittelt diesen Eindruck. –

+0

Wie so? Sie müssten davon ausgehen, dass sich der Code in der "Hauptklasse" befindet (was eigentlich nicht sein sollte; die Hauptklasse sollte nur den Anwendungslebenszyklus verwalten). Das OP sagt (s) er versucht wpf und/oder flex nachzuahmen, was meiner Meinung nach dazu tendiert, MVVM-Designs zu verwenden (obwohl ich kein Experte in diesen Technologien bin). In diesem Design möchten Sie die Ansicht vom Controller laden. –

Verwandte Themen