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

Diskutiere Wie Text Label in neuem Window von Main Stage setzen? im AWT, Swing, JavaFX & SWT Forum; 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...

  1. ralfb1105
    ralfb1105 Mitglied
    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:
    Code (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.
    Code (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:
    Code (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
     
  2. Vielleicht hilft dir dieses Buch hier weiter.
  3. Flown
    Flown Administrator Mitarbeiter
    Die Instanzierung der Felder musst du dir sparen, das wird von JavaFX gemacht. Z.B.:
    Code (Java):
    @FXML
    Label versionLabel;
    Ja
     
  4. Robat
    Robat Bekanntes Mitglied
    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
     
  5. dzim
    dzim Bekanntes Mitglied
    ...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
     
  6. ralfb1105
    ralfb1105 Mitglied
    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 !?
    Code (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 (Text):
    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
     
  7. Flown
    Flown Administrator Mitarbeiter
    Sieht aus als ob dein versionInfoLabel null ist und du somit eine NPE bekommst. In der fxml hast du auch die Id richtig gesetzt?
     
  8. ralfb1105
    ralfb1105 Mitglied
    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
     
    dzim und Robat gefällt das.
  9. Wenn du Java lernen möchtest, empfehlen wir dir dieses Buch hier
Passende Stellenanzeigen aus deiner Region:





Die Seite wird geladen...

Wie Text Label in neuem Window von Main Stage setzen? - Ähnliche Themen

JLabel Text einer geöffneten Gui über eine andere Klasse ändern!
JLabel Text einer geöffneten Gui über eine andere Klasse ändern! im Forum AWT, Swing, JavaFX & SWT
FX Label text wird nicht richtig angezeigt
FX Label text wird nicht richtig angezeigt im Forum AWT, Swing, JavaFX & SWT
NullPointerException bei Label.setText()
NullPointerException bei Label.setText() im Forum AWT, Swing, JavaFX & SWT
jLabel.setText -> Char in Str: NullpointerException
jLabel.setText -> Char in Str: NullpointerException im Forum AWT, Swing, JavaFX & SWT
JavaFX Ein Labeltext eine zeitlang anzeigen dann weiter machen
JavaFX Ein Labeltext eine zeitlang anzeigen dann weiter machen im Forum AWT, Swing, JavaFX & SWT
Thema: Wie Text Label in neuem Window von Main Stage setzen?