TableView Zeile hinzufügen

max514

Bekanntes Mitglied
Hey leute ich hab folgendes Problem und ich weiß einfach nicht wie ich es lösen soll? Ich verscuhe gerade dem JavaFX Table eine zeile hinzuzufügen und es kommt einfach eine mega lange fehlermeldung und ich weiß nicht warum ??


Kunde

Java:
package auftragsverwaltung;

/**
*
* @author xom
*/
public class Kunde {
    String Bezeichnung;
    String Organisationsname;
    String Name;
    String Vorname;
    String Telefonnummer;
    String Handynummer;
    String Email;
    String Straße;
    String PLZ;
    String Ort;
    String Land;

    public Kunde(String Bezeichnung, String Organisationsname, String Name, String Vorname, String Telefonnummer, String Handynummer,String Email, String Straße, String PLZ, String Ort, String Land) {
        this.Bezeichnung = Bezeichnung;
        this.Organisationsname = Organisationsname;
        this.Name = Name;
        this.Vorname = Vorname;
        this.Telefonnummer = Telefonnummer;
        this.Handynummer = Handynummer;
        this.Email = Email;
        this.Straße = Straße;
        this.PLZ = PLZ;
        this.Ort = Ort;
        this.Land = Land;
    }

    Kunde() {
       
    }

   

    public String getBezeichnung() {
        return Bezeichnung;
    }

    public String getOrganisationsname() {
        return Organisationsname;
    }

    public String getName() {
        return Name;
    }

    public String getVorname() {
        return Vorname;
    }

    public String getTelefonnummer() {
        return Telefonnummer;
    }

    public String getHandynummer() {
        return Handynummer;
    }
    public String getEmail() {
        return Email;
    }

    public String getStraße() {
        return Straße;
    }

    public String getPLZ() {
        return PLZ;
    }

    public String getOrt() {
        return Ort;
    }

    public String getLand() {
        return Land;
    }

    public void setBezeichnung(String Bezeichnung) {
        this.Bezeichnung = Bezeichnung;
    }

    public void setOrganisationsname(String Organisationsname) {
        this.Organisationsname = Organisationsname;
    }

    public void setName(String Name) {
        this.Name = Name;
    }

    public void setVorname(String Vorname) {
        this.Vorname = Vorname;
    }

    public void setTelefonnummer(String Telefonnummer) {
        this.Telefonnummer = Telefonnummer;
    }

    public void setHandynummer(String Handynummer) {
        this.Handynummer = Handynummer;
    }

    public void setEmail(String Email) {
        this.Email = Email;
    }
    public void setStraße(String Straße) {
        this.Straße = Straße;
    }

    public void setPLZ(String PLZ) {
        this.PLZ = PLZ;
    }

    public void setOrt(String Ort) {
        this.Ort = Ort;
    }

    public void setLand(String Land) {
        this.Land = Land;
    }
   
}

Der Verwaltungscontroller

Java:
package auftragsverwaltung;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

/**
* FXML Controller class
*
* @author xom
*/
public class KundenverwaltungController implements Initializable {

   
   
    @FXML
    private TableView<Kunde> Kundentabelle;
   
    @FXML
    private TableColumn<Kunde, String> Bezeichnung;

    @FXML
    private TableColumn<Kunde, String> Organisationsname;

    @FXML
    private TableColumn<Kunde, String> Nachname;

    @FXML
    private TableColumn<Kunde, String> Vorname;

    @FXML
    private TableColumn<Kunde, String> Telefonnummer;

    @FXML
    private TableColumn<Kunde, String> Handynummer;

    @FXML
    private TableColumn<Kunde, String> Email;

    @FXML
    private TableColumn<Kunde, String> Straße;

    @FXML
    private TableColumn<Kunde, String> PLZ;

    @FXML
    private TableColumn<Kunde, String> Ort;

    @FXML
    private TableColumn<Kunde, String> Land;

    @FXML
    void open_Kunde(ActionEvent event) {
        try {
           FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("neuerKunde.fxml"));
           Parent neuesPasswort = (Parent) fxmlLoader.load();
           Stage stage = new Stage();
           stage.setScene(new Scene(neuesPasswort)); 
           stage.show();  
           
           
         } catch (IOException ex) {
             Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
         }
    }
   
    public void KundeDazu(String Bezeichnung, String Organisationsname, String Name, String Vorname, String Telefonnummer,
            String Handynummer, String Email, String Straße, String PLZ, String Ort, String Land){
       
        Kunde k = new Kunde();
        k.setBezeichnung(Bezeichnung);
        k.setOrganisationsname(Organisationsname);
        k.setName(Name);
        k.setVorname(Vorname);
        k.setTelefonnummer(Telefonnummer);
        k.setHandynummer(Handynummer);
        k.setEmail(Email);
        k.setStraße(Straße);
        k.setPLZ(PLZ);
        k.setOrt(Ort);
        k.setLand(Land);
       
       Kundentabelle.getItems().add(k);
      
       
    }
   
   
    @Override
    public void initialize(URL url, ResourceBundle rb) {

    }   
   
}

und die Klasse zum hinzufügen von neuen Kunden

Java:
package auftragsverwaltung;

import com.jfoenix.controls.JFXTextField;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;

/**
* FXML Controller class
*
* @author xom
*/
public class NeuerKundeController implements Initializable {

   
     @FXML
    private JFXTextField Organisationsname;

    @FXML
    private JFXTextField Nachname;

    @FXML
    private JFXTextField Vorname;

    @FXML
    private JFXTextField Telefonnummer;

    @FXML
    private JFXTextField Handynummer;

    @FXML
    private JFXTextField Email;

    @FXML
    private JFXTextField Straße;

    @FXML
    private JFXTextField PLZ;

    @FXML
    private JFXTextField Ort;

    @FXML
    private JFXTextField Land;

    @FXML
    void Hinzufügen(ActionEvent event) {
        String ON;
        String BE;
        String NN;
        String VN;
        String TN;
        String HN;
        String EM;
        String ST;
        String PO;
        String OR;
        String LA;
       
        KundenverwaltungController c = new KundenverwaltungController();
       
        if(Organisationsname.getText().length() ==0){
            ON = "-";
            BE = "P";
        }
        else{
            ON = Organisationsname.getText();
            BE = "V";
        }
        if(Nachname.getText().length() ==0){
            NN = "-";
           
        }
        else{
            NN = Nachname.getText();
           
        }
        if(Vorname.getText().length() ==0){
            VN = "-";
           
        }
        else{
            VN = Vorname.getText();
           
        }
        if(Telefonnummer.getText().length() ==0){
            TN = "-";
           
        }
        else{
            TN = Telefonnummer.getText();
           
        }
        if(Handynummer.getText().length() ==0){
            HN = "-";
           
        }
        else{
            HN = Handynummer.getText();
           
        }
       
        if(Email.getText().length() ==0){
            EM = "-";
           
        }
        else{
            EM = Email.getText();
           
        }
        if(Straße.getText().length() ==0){
            ST = "-";
           
        }
        else{
            ST = Straße.getText();
           
        }
        if(PLZ.getText().length() ==0){
            PO = "-";
           
        }
        else{
            PO = PLZ.getText();
           
        }
        if(Ort.getText().length() ==0){
            OR = "-";
           
        }
        else{
            OR = Ort.getText();
           
        }
       
       
        if(Land.getText().length() ==0){
            LA = "-";
           
        }
        else{
            LA = Land.getText();
           
        }
     
        c.KundeDazu(BE, ON, NN, VN, TN, HN, EM, ST, PO, OR, LA);
           
              

    }
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }   
   
}

Fehlermeldung :
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:380)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415)
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(Thread.java:745)
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 auftragsverwaltung.KundenverwaltungController.KundeDazu(KundenverwaltungController.java:99)
at auftragsverwaltung.NeuerKundeController.Hinzufügen(NeuerKundeController.java:153)
... 58 more
 
-> auftragsverwaltung.NeuerKundeController.Hinzufügen(NeuerKundeController.java:153)
KundenverwaltungController c = new KundenverwaltungController();
Damit erstellst du einen neuen leeren Controller, der an kein UI gebunden ist!
Daher ist dort auch kein initialize aufgerufen und keine @FXML Injection der GUI-Komponenten gemacht worden. Die Tabelle ist in diesem Kontroller dementsprechend "null".

Schnelle Lösung (und etwas unsauber): Was du machen musst ist, den oberen Controller an den NeuerKundeController übergeben. Also dort einen Setter dafür einfügen.
Alternativ suche bitte im Forum hier nach ControllerFactory. Das wäre der etwas elegantere Weg.
Noch besser wäre es dann, du würdest ein Modell haben, auf dem du die Daten aktualisierst, dass beiden Controllern injiziert wird (wieder über die ControllerFactory-Variante).

Generell: Der Code ist sehr unsauber! Und ignoriert einige Guidelines. CamelCase ist für Klassen ok, für Methoden und Variablen aber beginnen sie immer mit kleinen Buchstaben - also camelCase.
UTF-Charaktere wie das "ß" sind im Code zwar erlaubt, ich würde sie aber nicht verwenden. Generell würde ich eher Englisch als Sprache innerhalb der Applikation verwenden.
 
Ohne genau nachgezählt zu haben - mal ins blaue geraten. Das hier ist Zeile 99 in der Klasse KundenverwaltungController.
Kundentabelle.getItems().add(k);
Du greifst an dieser Stelle auf ein JavaFX Element zu. Diese werden intern, durch JavaFX selbst, in den Controller populiert und du musst dich dabei nicht selber um die Verknüpfung kümmern. Das ganze funktioniert allerdings nur, wenn du JavaFX auch das Instanziieren der Controller Klassen überlässt.
In deiner Klasse NeuerKundeController hast du folgende Zeile stehen, wo du händisch einen Controller instanziierst.
KundenverwaltungController c = new KundenverwaltungController();
Alle JavaFX Komponenten dieser Controller-Instanz sind null (daher auch die NullPointerException), da du den Controller instanziierst und nicht JavaFX.
Sollte einer deiner Controller Abhängigkeiten benötigen, wie hier zB einen anderen Controller, so musst du diesen selbst (über Setter oder Konstruktor) in den Controller übergeben.
Hier mal ein kleines Beispiel
Java:
public class Main extends Application {
    @Override
    public void start( Stage primaryStage ) throws Exception {
        Pane root = FXMLLoader.load(getClass().getResource("/controllerinjection/first.fxml"));
        primaryStage.setScene(new Scene(root, 500, 500));
        primaryStage.show();
    }
}
Java:
public class FirstController {

    @FXML
    private AnchorPane anchorPane;

    @FXML
    public void goToSecondSceneAction(final ActionEvent event) throws IOException {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("/controllerinjection/second.fxml"));
        Pane root = loader.load();
        SecondController controller = loader.getController();
        controller.setFirstController(this);

        ((Stage )anchorPane.getScene().getWindow()).setScene(new Scene(root));
    }

    public void doSomething() {
        System.out.println("Hello from FirstController");
    }
}
Java:
public class SecondController {

    private FirstController firstController;

    @FXML
    public void testFirstControllerAction(final ActionEvent event) {
        System.out.println("FirstController is: " + firstController);
        firstController.doSomething();
    }

    public void setFirstController( final FirstController firstController ) {
        this.firstController = firstController;
    }
}

Edit: @dzim war wohl diesmal schneller. 😛
 
Also ich hab des Prinzip von JavaFX zwar noch nicht ganz verstanden aber ich hab den code jetzt so geändert ? jetzt kommt zwar keine Fehlermeldung mehr das Kundenobjekt wird aber trotzdem nicht der Tabelle hinzugefügt ?

Java:
ackage auftragsverwaltung;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.control.TableView;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;


public class KundenverwaltungController implements Initializable {

    
    
    @FXML
    private TableView<Kunde> Kundentabelle;
    
    

    @FXML
    void open_Customer(ActionEvent event) {
        try {
            
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("neuerKunde.fxml"));
            Pane root = loader.load();
            Stage stage = new Stage();
            stage.setScene(new Scene(root)); 
            NeuerKundeController controller = loader.getController();
            controller.setKundenverwaltungController(this);
            stage.show();
           
     
      
            
            
         } catch (IOException ex) {
             Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
         }
    }
    
    public void kundeDazu(String Bezeichnung, String Organisationsname, String Name, String Vorname, String Telefonnummer,
            String Handynummer, String Email, String Straße, String PLZ, String Ort, String Land){
        
        Kunde k = new Kunde();
        k.setBezeichnung(Bezeichnung);
        k.setOrganisationsname(Organisationsname);
        k.setName(Name);
        k.setVorname(Vorname);
        k.setTelefonnummer(Telefonnummer);
        k.setHandynummer(Handynummer);
        k.setEmail(Email);
        k.setStraße(Straße);
        k.setPLZ(PLZ);
        k.setOrt(Ort);
        k.setLand(Land);
        Kundentabelle.getItems().add(k);
        
        
        
       
        
    }
    
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {

    }    
    
}

Java:
package auftragsverwaltung;

import com.jfoenix.controls.JFXTextField;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;

/**
 * FXML Controller class
 *
 * @author xom
 */
public class NeuerKundeController implements Initializable {

    private KundenverwaltungController Controller;
           
    @FXML
    private JFXTextField Organisationsname;

    @FXML
    private JFXTextField Nachname;

    @FXML
    private JFXTextField Vorname;

    @FXML
    private JFXTextField Telefonnummer;

    @FXML
    private JFXTextField Handynummer;

    @FXML
    private JFXTextField Email;

    @FXML
    private JFXTextField Straße;

    @FXML
    private JFXTextField PLZ;

    @FXML
    private JFXTextField Ort;

    @FXML
    private JFXTextField Land;

    @FXML
    void Hinzufügen(ActionEvent event) {
        String ON;
        String BE;
        String NN;
        String VN;
        String TN;
        String HN;
        String EM;
        String ST;
        String PO;
        String OR;
        String LA;
        
        
        
        if(Organisationsname.getText().length() ==0){
            ON = "-";
            BE = "P";
        }
        else{
            ON = Organisationsname.getText();
            BE = "V";
        }
        if(Nachname.getText().length() ==0){
            NN = "-";
            
        }
        else{
            NN = Nachname.getText();
            
        }
        if(Vorname.getText().length() ==0){
            VN = "-";
            
        }
        else{
            VN = Vorname.getText();
            
        }
        if(Telefonnummer.getText().length() ==0){
            TN = "-";
            
        }
        else{
            TN = Telefonnummer.getText();
            
        } 
        if(Handynummer.getText().length() ==0){
            HN = "-";
            
        }
        else{
            HN = Handynummer.getText();
            
        }
        
        if(Email.getText().length() ==0){
            EM = "-";
            
        }
        else{
            EM = Email.getText();
            
        }
        if(Straße.getText().length() ==0){
            ST = "-";
            
        }
        else{
            ST = Straße.getText();
            
        }
        if(PLZ.getText().length() ==0){
            PO = "-";
            
        }
        else{
            PO = PLZ.getText();
            
        }
        if(Ort.getText().length() ==0){
            OR = "-";
            
        }
        else{
            OR = Ort.getText();
            
        }
        
        
        if(Land.getText().length() ==0){
            LA = "-";
            
        }
        else{
            LA = Land.getText();
            
        }
      
        Controller.kundeDazu(BE, ON, NN, VN, TN, HN, EM, ST, PO, OR, LA);
            
               

    }
    
    public void setKundenverwaltungController( final KundenverwaltungController Controller ) {
        this.Controller = Controller;
    }
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    

    
    
}
 
Mal vom Code abgesehen sieht es im Prinzip "OK" aus. Keine Fehlermeldung? Eventuell starte das Programm über deine IDE im Debug-Modus.
 

Neue Themen


Zurück
Oben