JavaFX Wie Text Label in neuem Window von Main Stage setzen?

Bitte aktiviere JavaScript!
Hallo,
ich habe eine JavaFX Application mit Scene Builder erstellt und möchte nun über ein Menue (Help / About) ein neues Window öffnen in dem ich über ein Label und TextField Informationen zu meiner Applikation darstelle. Das öffnen und schließen des neuen Fenster funktioniert ohne Probleme, doch leider scheitere ich daran in einer Node (Label, TextField) Text zu setzen und diesen anzuzeigen. Hier mein bisheriger Code zu diesem Problem:
1. Ich habe eine FXML Datei erstellt und mit dem Scene Builder eine VBox mit HBox und einem Label.
2. Das neue Fenster wird aus Main beim drücken "Help/About" (MenuBar - Menu - MenuItem) über folgende Methode gestartet:
Java:
public void menuHelpAbout() throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/application/aboutDialog.fxml"));
        Parent rootAboutDialog = fxmlLoader.load();
        Stage stage = new Stage();
        stage.initModality(Modality.NONE);
        stage.setOpacity(1);
        stage.setTitle("OraSimpleConnectFX About");
        stage.setScene(new Scene(rootAboutDialog));
        stage.show();
    }
3. Ich habe eine Controller Class "ControllerAboutDialog.class" erstellt und diese im Scene Builder zugewiesen. Hier die Controller Klasse.
Java:
package application;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

public class ControllerAboutDialog {

    // Fields
    public final String versionInfo = "Version: 1.0.0";
   
    // Constructor
    public ControllerAboutDialog() {
        super();
        versionInfoLabel.setText(versionInfo);
        System.out.println(versionInfo);
        featureInfoTextField.appendText("HuHuHuHu");
        System.out.println("HuHuHu");
    }   
   
    @FXML
    Label versionInfoLabel = new Label();
   
    @FXML
    TextField featureInfoTextField = new TextField();
   
    @FXML
    Button ok = new Button();
   
    // Methods
   
    public void okButtonTapped() {
        Stage stageAboutDialog = (Stage) ok.getScene().getWindow();
        stageAboutDialog.close();
    }
   

}
Das beenden des Window über den OK Button funktiniert, aber es wird nichts im Label dargestellt ??? Auch wenn ich testweise das Label folgendermaßen definiere:
Java:
Label versionInfoLabel = new Label(versionInfo);
Schreibe ich den Text im SceneBuilder unter properties des Labels wird der Text angezeigt.

Frage:
Kann mir jemand bitte helfen zu verstehen wie ich das in einem neuen Fenster machen muss?
Ist es richtig für dieses zweite Fenster einen neuen Controller zu definieren?

Gruß

Ralf
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Beachte, dass du im Konstruktor keinen Zugriff auf Felder hast, die mit @FXML annotiert sind. Erst in der initialize() Methode sind die Komponenten initialisiert und bereit damit zu arbeiten.
Du hättest übrigens auch einen Dialog/Alert für deine Zwecke nutzen können
 
...oder dir den Controller vom FXMLLoader holen und per setter (oder ähnlicher) Methode setzen - weil der Controller, den du erhälst ist bereits initialisiert (d.h., du kannst wahrscheinlich deinen Kram auch in der initialize Methode machen).

#edit: @Robat - war ich wohl zu langsam... oder du zu schnell... :p
 
Hallo dzim, Robat,

Danke für die Info über die "initialize" Methode, die kannte ich bis dato nicht. Danke auch an Flown für die Info mit den FXML Feldern.
Ich habe versucht meinen Controller nun folgendermaßen umzubauen, doch leider kommt einen Java Exception wenn ich versuche in einem Node Text zu setzen - das sysout funktioniert !?
Java:
ackage application;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

public class ControllerAboutDialog {

    // Fields
    public final String versionInfo = "Version: 1.0.0";
   
    // Constructor
   
    @FXML
    Label versionInfoLabel;
   
    @FXML
    TextField featureInfoTextField;
   
    @FXML
    Button ok;
   
    @FXML
    public void initialize() {
        System.out.println("Initialziation ...");
        versionInfoLabel.setText("Version: 1.0.0");
    }
   
    // Methods
   
    public void okButtonTapped() {
        Stage stageAboutDialog = (Stage) ok.getScene().getWindow();
        stageAboutDialog.close();
    }
   

}
Die Exception:
Code:
Initialziation ...
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.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    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.control.MenuItem.fire(MenuItem.java:462)
    at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1405)
    at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.lambda$createChildren$343(ContextMenuContent.java:1358)
    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.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)
    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)
    ... 43 more
Caused by: javafx.fxml.LoadException:
/C:/pdbrboer/GIT/Udeny-JavaGrundlagen/TestThread1/bin/application/aboutDialog.fxml

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2571)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
    at application.Controller.menuHelpAbout(Controller.java:68)
    ... 53 more
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.loadImpl(FXMLLoader.java:2566)
    ... 56 more
Caused by: java.lang.NullPointerException
    at application.ControllerAboutDialog.initialize(ControllerAboutDialog.java:28)
    ... 66 more
Was habe ich hier falsch verstanden bzw. implemntiert?
Gruß
Ralf
 
Sieht aus als ob dein versionInfoLabel null ist und du somit eine NPE bekommst. In der fxml hast du auch die Id richtig gesetzt?
 
Danke Flown, Du hast vollkommen Recht - Montag Morgen - vollkommen blöder Fehler :rolleyes:
Ich habe den String versionInfo genannt und dann das Label von versionInfo auf versionInfoLabel, das aber nicht im FXML geändert - SORYY .. jetzt funktioniert es wie von Euch beschrieben.

BTW, das mit Dialog/Alert werde ich auch noch testen, benötige ich auch noch in meiner Applikation.
Wünsche Euch noch einen schönen Start in die Woche.
Gruß
Ralf
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben