JavaFX Übergabe von Parametern an Controller

RobGe

Mitglied
Hey Leute!

Ich habe ein Programm geschrieben, das Personen in eine Datenbank einträgt. Alles klappt soweit.

Ich habe ein Problem mit meiner Class PersonOverview. Wenn ich alle angaben gemacht habe, möchte ich auf speichern drücken. Jedoch soll dann erst ein Fenster kommen, dass nochmal alles auf einen Blick zeigt. Gefolgt dessen soll dann ein return true oder false ausgeben werde. Ob es gespeichert wird oder nicht.

Das erste Fenster ist das:
Java:
 public void show()
    {
        PersonOverviewController  POV = new PersonOverviewController()
        POV.FillIn(info[0],info[1],info[2],info[3],info[4],info[5],info[6],info[7],"AAAAA","AAA0A");
        POV.insert();
        POV.display();
    }

Dabei ist das meine Class Datei

Java:
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;


public class PersonOverviewController implements Initializable {

    @FXML
    private Label vName;
    @FXML
    private Label nName;
    @FXML
    private Label gender;
    @FXML
    private Label birth;
    @FXML
    private Label age;
    @FXML
    private Label gbort;
    @FXML
    private Label national;
    @FXML
    private Label strasse;
    @FXML
    private Label ort;
    @FXML
    private Label ausnr;

    private String [] info = new String [10]; 
   
     public void FillIn(String vName,String nName,String gender,String birth,String gbort,String national,String strasse,String ort,String postlz,String ausnr)
    {
      info[0]=vName;
      info[1]=nName;
      info[2]=gender;
      info[3]=birth;
      info[4]=gbort;
      info[5]=national;
      info[6]=strasse;
      info[7]=ort;
      info[8]=postlz;
      info[9]=ausnr;
     
     
    }
      public void insert()
     {
         
      this.nName.setText(info[0]);
      this.gender.setText(info[1]);
      this.birth.setText(info[2]);
      this.gbort.setText(info[3]);
      this.national.setText(info[4]);
      this.strasse.setText(info[5]);
      this.ort.setText(info[8] + " " + info[7]);
      this.ausnr.setText(info[9]);
     }
     public void display()
     {
        try {
               
                FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("PersonOverview.fxml"));
                Parent root1 = (Parent) fxmlLoader.load();
                Stage stage = new Stage();
                stage.setResizable(false);
                stage.setScene(new Scene(root1)); 
                stage.show();
               
               
               
        } catch (IOException ex) {
            Logger.getLogger(PersonOverviewController.class.getName()).log(Level.SEVERE, null, ex);
        }
     }
   
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
     
    }   
   
}


Sobald ich auf ein Label zugreifen möchte, kommt:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException

Ich schon vieles versucht, aber es klappt einfach nicht?

So soll das aussehen (die labels sollen sich ändern)

UCwB5m8.png



2. Wie kann ich es so ändern, dass das vorherige Window auf die Ausgabe wartet (false oder true)?

Ich habe schon Stunden versucht es zu fixen. Aber jetzt weiß ich nicht weiter :/

 

Anhänge

  • helop.PNG
    helop.PNG
    19,5 KB · Aufrufe: 26
Java:
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:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8413)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    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.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:394)
    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$353(GlassViewEventHandler.java:432)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
    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$147(WinApplication.java:177)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    ... 48 more
Caused by: java.lang.NullPointerException
    at register_zoll.PersonOverviewController.insert(PersonOverviewController.java:66)
    at register_zoll.PersonerfassenfxController.show(PersonerfassenfxController.java:84)
    at register_zoll.PersonerfassenfxController.check(PersonerfassenfxController.java:75)
    ... 58 more

Und wie sieht der Rest der Exception aus?
 
Ah - du musst der View (bzw dem Loader) natürlich noch den Controller übergeben, ansonsten sind kennt der Controller die View nicht, und alle Labels sind nicht initialisiert.
Außerdem müsstest du display und insert tauschen - die View muss ja zumindest initialisiert sein, bevor du auf deren Elemente zugreifen kannst.

Hast du dir mal die Grundlagen zu JavaFX und FXML angeguckt?
 
Ah - du musst der View (bzw dem Loader) natürlich noch den Controller übergeben, ansonsten sind kennt der Controller die View nicht, und alle Labels sind nicht initialisiert.
Außerdem müsstest du display und insert tauschen - die View muss ja zumindest initialisiert sein, bevor du auf deren Elemente zugreifen kannst.

Hast du dir mal die Grundlagen zu JavaFX und FXML angeguckt?
Ahh okay... aber wie übergebe ich den? habe das nicht mit der Class? Ist doch eigentlich der Controller für die FXML.

Ich habe mich damit schon auseinander gesetzt. Mehr oder weniger hatten wir das auch schon im Studium. Da haben wir angefangen, es noch zu schreiben. Jetzt arbeiten wir mit Scene Builder. Aber auch erst seit 2 Wochen.

Danke dir 🙂!
 
Ich habe es versucht den Controller zu zuordnen.
Java:
 public void display()
     {
        try {

                FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("PersonOverview.fxml"));
             
                Parent root1 = (Parent) fxmlLoader.load();
                fxmlLoader.setController(this);
                Stage stage = new Stage();
                stage.setResizable(false);
                stage.setScene(new Scene(root1));
               System.out.print(nName);
                stage.show();
             
             
             
        } catch (IOException ex) {
            Logger.getLogger(PersonOverviewController.class.getName()).log(Level.SEVERE, null, ex);
        }
     }

Ich habe die Parameter ausgegeben. Wenn ich ein Object der Klasse erstelle, können diese zugeordnet werden. Nutze ich jedoch die Methode .display() so kommt es mir vor, als würde ein neues Object der Klasse enstehen? Sie stehen auf null.

Eventuell ist das auch falsch gedacht. Ich habe in den Controller eine Methode, um das Fenster zu erschaffen. Aber auch wenn ich in den Controller des normalen Fensters schreibe... kommt da auch nichts dabei raus?

Java:
 public void show()
    {
        sortInfo();
        PersonOverviewController  POV = new PersonOverviewController();
     
     
         try {

                FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("PersonOverview.fxml"));
             
                Parent root1 = (Parent) fxmlLoader.load();
                fxmlLoader.setController(POV);
                POV.FillIn(info[0],info[1],info[2],info[3],info[4],info[5],info[6],info[7],"AAAAA","AAA0A");
                Stage stage = new Stage();
                stage.setResizable(false);
                stage.setScene(new Scene(root1));
               
                stage.show();
              POV.insert();
             
             
        } catch (IOException ex) {
            Logger.getLogger(PersonOverviewController.class.getName()).log(Level.SEVERE, null, ex);
        }}
 
Ich experimentiere auch gerade mit JavaFX und habe den Controller in der fxml angegeben, das geht auch im Scenebuilder, ich glaube in der Leiste links - unten.
Code:
<AnchorPane ... fx:controller="controller.MainViewController">
 
Ich habe die Parameter ausgegeben. Wenn ich ein Object der Klasse erstelle, können diese zugeordnet werden. Nutze ich jedoch die Methode .display() so kommt es mir vor, als würde ein neues Object der Klasse enstehen? Sie stehen auf null.

Eventuell ist das auch falsch gedacht. Ich habe in den Controller eine Methode, um das Fenster zu erschaffen. Aber auch wenn ich in den Controller des normalen Fensters schreibe... kommt da auch nichts dabei raus?
Was ist denn in beiden Fällen noch das Problem?
 

Zurück
Oben