JavaFX Tableview Daten hinzufügen aus anderer Klasse

Jak111

Mitglied
Ich habe in einem Fenster eine Tabelle erstellt in welcher Artikel aufgelistet werden sollen (Name, Beschreibung und Preis). Die Tabelle soll mit einer ObservableList gefüllt werden. Das funktioniert auch wenn ich die Daten mit
Java:
setArtikelObservableList("test","test",300.00);
in der selben Klasse hinzufüge. Ich wollte jetzt noch ein 2.Fenster erstellen (für eine bessere Übersicht) in welcher mann in 3 versch. Textfeldern die Daten eingibt und diese dann in der ObservableList (und somit in der Tabelle) gespeichert werden. Jedoch weiß ich nicht wie ich von der dieser Klasse zugriff auf die ObservableList der 1 Klasse erhalte ?

Danke für eure Hilfe!🙂
 
übergebe die Liste per Konstruktor oder Methode und speichere eine Referenz darauf. Falls das nicht geht, biete eine Getter-Methode an.
 
So ungefähr:
Java:
public class ZweitesFenster{
   ObservableList<Object> liste;
   public ZweitesFenster(ObservableList<Object> liste){
        this.liste = liste;
   }
}

Aufruf aus deiner ersten Klasse:
Java:
// klasse eins
ObservableList<Object> listeErsteKlasse;
// Erzeugung mit der Para.Übergabe.
ZweitesFenster zweitesF = new ZweitesFenster(listeErsteKlasse);

Mit der Liste der ErstenKlasse kannst du somit, dank der Referenz arbeiten.
 
Ich hab es zwar noch nicht so probiert, aber dein zweites Fenster muss ja wieder eine Stage sein. Du kannst dieser Stage über #setUserData ein beliebiges Objekt mitgeben (die Methode stammt aus der Oberklasse Window). Dann kannst du sie im Controller (wenn du FXML verwendest) mit Control#getScene#getWindow#getUserData wieder hervorholen.
Vielleicht hilft dir das ja.
 
Das will irgendwie alles nicht richtig funktionieren. Ich poste mal den Code vllt könnt ihr mir dann besser helfen:
Controller des 1.Fenster (wo die Tabelle angezeigt wird)
Java:
public class MainWindowController {

    //Views
    @FXML public TableView <Artikel> tableView;
    @FXML public TableColumn <Artikel, String> artikelColumn;
    @FXML public TableColumn <Artikel, String> beschreibungColumn;
    @FXML public TableColumn <Artikel, Double> preisColumn;


    private Main main;
    private Stage primaryStage;

    public Artikel artikel;

    public ObservableList<Artikel> artikelList  = FXCollections.observableArrayList();

    public void initialize(){


        artikelColumn.setCellValueFactory(new PropertyValueFactory<Artikel, String>("artikelName"));
        beschreibungColumn.setCellValueFactory(new PropertyValueFactory<Artikel, String>("beschreibung"));
        preisColumn.setCellValueFactory(new PropertyValueFactory<Artikel, Double>("preis"));


    }

    public void setMain(Main main, Stage primaryStage) { // Verbindung Main Class
        this.main = main;
        this.primaryStage = primaryStage;

        AddArticleController c = new AddArticleController();
        c.addArticle(artikelList);
        tableView.setItems(FXCollections.observableArrayList(artikelList));
    }

    @FXML
    public void onCloseStage() {
        primaryStage.close();
    }
    @FXML
    public void onAddArticle() {

        main.articleWindow();
    }


}

Main Klasse
Java:
public class Main extends Application {

    private Stage primaryStage;

    @Override
    public void start(Stage primaryStage) throws Exception {
        this.primaryStage = primaryStage;
        mainWindow();

    }

    public void mainWindow() {
        try {
            FXMLLoader loader = new FXMLLoader(Main.class.getResource("/view/MainWindowView.fxml"));
            AnchorPane pane = loader.load();

            primaryStage.setMinWidth(800);
            primaryStage.setMinHeight(600);

            Scene scene = new Scene(pane);

            MainWindowController mainWindowController = loader.getController(); //Verbindung zum Controller
            mainWindowController.setMain(this, primaryStage);

            primaryStage.setScene(scene);
            primaryStage.show();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void articleWindow(){ // Erstellt neues Fenster
        try {
            FXMLLoader loader = new FXMLLoader(Main.class.getResource("/view/AddArticleView.fxml"));
            AnchorPane pane = loader.load();

            Scene scene = new Scene(pane);
            Stage secondaryStage = new Stage();

            AddArticleController addArticleController = loader.getController(); //Verbindung zum Controller
            addArticleController.setMain(this, secondaryStage);

            secondaryStage.setScene(scene);
            secondaryStage.initOwner(primaryStage);
            secondaryStage.initModality(Modality.APPLICATION_MODAL);
            secondaryStage.show();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        launch(args);
    }
}
Controller des 2.Fensters für die Eingabe. In dieser Klasse möchte ich die Liste vom 1. Controller verwenden..
Java:
public class AddArticleController {

    //Views
    @FXML private TextField txtArtikelName;
    @FXML private TextArea txtBeschreibung;
    @FXML private TextField txtPreis;

    ObservableList<Artikel> liste;

    String artName;
    String artBeschreibung;
    double artPreis;


    private Main main;
    private Stage secondaryStage;


    public Artikel artikel;



    public void setMain(Main main, Stage secondaryStage) { // Verbindung Main Class
        this.main = main;
        this.secondaryStage = secondaryStage;

    }
    public void addArticle(ObservableList<Artikel> liste){
        this.liste = liste;
    }
    @FXML
    public void goBack() {
        secondaryStage.close();


    }
    @FXML
    public void onAddArticle(){
        liste.add(new Artikel("test","beschreibung" ,300.00));


        txtArtikelName.clear();
        txtBeschreibung.clear();
        txtPreis.clear();
    }


}

Und noch die Artikel Klasse:
Java:
public class Artikel {
    private StringProperty artikelName;
    private StringProperty beschreibung;
    private DoubleProperty preis;

    public Artikel(String artikelName, String beschreibung, double preis) {
        this.artikelName = new SimpleStringProperty(artikelName);
        this.beschreibung = new SimpleStringProperty(beschreibung);
        this.preis = new SimpleDoubleProperty(preis);
    }

    //GETTER

    public String getArtikelName() {
        return artikelName.get();
    }

    public String getBeschreibung() {
        return beschreibung.get();
    }

    public double getPreis() {
        return preis.get();
    }


    //SETTER

    public void setArtikelName(String artikelName) {
        this.artikelName.set(artikelName);
    }

    public void setBeschreibung(String beschreibung) {
        this.beschreibung.set(beschreibung);
    }

    public void setPreis(double preis) {
        this.preis.set(preis);
    }


}

Vielen Dank für eure Hilfe!🙂
 
Das will irgendwie alles nicht richtig funktionieren.
Beginne als erstes einmal damit, was denn überhaupt passiert.
Dann lass mich dir sagen, dass ich es fragwürdig finde, ein neues Fenster zu öffnen und das im Moment aktive gleich zu schliessen. Es wäre in dem Szenario sinnvoller, einfach die Scene des Hauptfensters, oder besser noch nur einen bestimmten Node auszutauschen, als deinen bisherigen Ansatz weiter zu verfolgen.

Also: Erkläre erst einmal, was du jetzt genau von deinem Code erwartet hast, was anstelle dessen passiert und dann sehen wir weiter. Ok?
 
Erstmal danke für deine Antwort 🙂 Wie bereits gesagt besteht mein Programm aus 2 Fenster (mit jeweils einem Controller) und der Main Klasse. Beim start des Programms wird in der Main Klasse das 1. Fenster aufgerufen auf welchem die Daten (Artikelname, Beschreibung, Preis) in einer Tabelle aufgelistet werden sollen. Wenn man auf dem Button "Artikel hinzufügen" klickt öffnet sich ein 2.Fenster in welchem man einen neuen Artikeleingeben kann (also den Namen, Beschreibung und Preis).
Mein Problem ist wie gesagt dass ich nicht weiß wie ich die ObserveableList des 1.Fensters in dieser Klasse aufrufen bzw. verwenden kann.

Wenn ich direkt im Controller des 1.Fensters die Artikel hinzufüge also z.B. artikelList.add(new Artikel("name", "Test beschreibung", 30.00); dann funktioniert das ohne Probleme und der Artikel wird auch in der Tabelle angezeigt
 
--> Sry für den unschönen Code, soll aber nur eine Demo sein <--
wie ich schon gesagt habe, du benötigt nur eine referenz auf die main klasse oder deiner liste.
natürlich auch eine update methode für deine tableview.

zb. Das ist das Object Person
Java:
public class Person {
        private String vorname;
        private String nachname;
  
        public Person(String vn, String nn) {
            this.nachname = nn;
            this.vorname = vn;
        }

        public String getVorname() {
            return vorname;
        }

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

        public String getNachname() {
            return nachname;
        }

        public void setNachname(String nachname) {
            this.nachname = nachname;
        }
    }

--> Das ist meine Application Class ( Mein Start Fenster )
--> Der Code ist nur schnell wegen der Demo geschrieben worden...Augenkrebs GEFAHR! 🙂
Java:
public class MainApp extends Application {

    private final ObservableList<Person> liste = FXCollections.observableArrayList();
    private TableView<Person> table;
    private Button btnNeu;

    @Override
    public void start(Stage primaryStage) {

        primaryStage.setTitle("MAIN APP");
        primaryStage.setScene(new Scene(getVBox(), 300, 300));
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    // VBOX FÜR DIE STAGE //
    private VBox getVBox() {
        table = new TableView<>();
        columns();

        btnNeu = new Button("NEU ANLAGE");
        btnNeu.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                // FENSTER FÜR DIE NEU ANLAGE
                new ZweitesFenster(MainApp.this, liste);
            }
        });

        VBox v = new VBox(10, table, btnNeu);
        return v;
    }

    /*
        NICHT SCHÖN ABER SOLL AUCH NUR EINE DEMO SEIN
    */
    private void updateTable() {
        table.getItems().clear();
        table.getItems().addAll(getDaten());
    }

    /*
        Columns für die Tabelle
    */
    private void columns() {
        TableColumn<Person, String> colVN = new TableColumn<>("VORNAME");
        colVN.setCellValueFactory(new PropertyValueFactory<>("vorname"));

        TableColumn<Person, String> colNN = new TableColumn<>("NACHNAME");
        colNN.setCellValueFactory(new PropertyValueFactory<>("nachname"));

        table.getItems().addAll(getDaten());
        table.getColumns().addAll(colVN, colNN);
    }

    /*
        Start Daten für die Tabelle
    */
    private ObservableList<Person> getDaten() {
        return liste;
    }
}

--> und hier das zweite fenster
--> dem konstruktor übergebe ich zwei referenzen, MainApp und die Liste
Java:
public class ZweitesFenster extends Stage{
        Stage stage;
        TextField tfVN,tfNN;
        Button btnSpeichern;
        Person neuePerson;
        // ----> HIER ÜBERGEBE ICH DIE REFERENZ DER DEMO CLASS UND DER LISTE //
        public ZweitesFenster(MainApp app,ObservableList<Person> liste){
           
            tfVN = new TextField();
            tfNN = new TextField();
            btnSpeichern = new Button("SPEICHERN");
            btnSpeichern.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    // NEUE PERSON
                    neuePerson = new Person(tfVN.getText(), tfNN.getText());
                    // PERSON ZU LISTE HINZU
                    liste.add(neuePerson);
                    // TABLE UPDATEN
                    app.updateTable();
                }
            });
           
            setTitle("ZWEITES FENSTER");
            setScene(new Scene(new VBox(10, tfVN,tfNN,btnSpeichern), 200, 200));
            show();
        }
    }

also die moral von der geschichte ist --> Verwende Referenzen <--

WIE SCHON ERWÄHNT DER CODE WURDE SCHNELL GESCHRIEBEN UND KÖNNTE AUGEBKREBS VERURSACHEN..
 

Neue Themen


Zurück
Oben