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!:)
 

JCODA

Top Contributor
übergebe die Liste per Konstruktor oder Methode und speichere eine Referenz darauf. Falls das nicht geht, biete eine Getter-Methode an.
 

thet1983

Top Contributor
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.
 

dzim

Top Contributor
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.
 

Jak111

Mitglied
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!:)
 

dzim

Top Contributor
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?
 

Jak111

Mitglied
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
 

thet1983

Top Contributor
--> 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..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Tableview Daten hinzufügen und aktualisieren AWT, Swing, JavaFX & SWT 5
J TableView Daten werden nicht ausgegeben AWT, Swing, JavaFX & SWT 9
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
M JavaFX TableView nur erste Zeile editable machen und gelb markieren AWT, Swing, JavaFX & SWT 0
Encera TableView Zeilen als Spalten im SceneBuilder AWT, Swing, JavaFX & SWT 0
T TableView Button onAction AWT, Swing, JavaFX & SWT 3
mrbody234 ArrayList<Message> in eine TableView visualisieren AWT, Swing, JavaFX & SWT 2
izoards JavaFX TableView mit Array Inhalt füllen AWT, Swing, JavaFX & SWT 1
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
I JavaFX Zellen in Tableview editieren AWT, Swing, JavaFX & SWT 0
A TableView updatet sich nicht AWT, Swing, JavaFX & SWT 3
missy72 JavaFX TableView Spalte zwischen den Zeilen AWT, Swing, JavaFX & SWT 5
W TableView füllen AWT, Swing, JavaFX & SWT 18
missy72 JavaFX TableView / IconView mit MousEvent AWT, Swing, JavaFX & SWT 7
missy72 JavaFX Performance / ImageView in TableView über TimeLine AWT, Swing, JavaFX & SWT 1
T TableView aktualisieren AWT, Swing, JavaFX & SWT 1
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
T TableView Zeilen einfärben AWT, Swing, JavaFX & SWT 13
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
W JavaFX TableView aktualisieren AWT, Swing, JavaFX & SWT 1
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
B JavaFX TableView-Zellen sollen automatisch so groß wie der größte Inhalt sein AWT, Swing, JavaFX & SWT 6
D JavaFX Nullpointerexception wegen TableView AWT, Swing, JavaFX & SWT 2
S Alternative JavaFX TableView AWT, Swing, JavaFX & SWT 1
L JavaFX Tableview row callback AWT, Swing, JavaFX & SWT 0
G Bekomme ResultSet mittels ObservableList nicht ins TableView AWT, Swing, JavaFX & SWT 25
S JavaFX JavaFX TableView scrollen färbt falsche Zeilen AWT, Swing, JavaFX & SWT 1
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
J JavaFx TableView mit CheckBox AWT, Swing, JavaFX & SWT 4
P JavaFX TableView Zelle markieren AWT, Swing, JavaFX & SWT 3
L JavaFX Tableview Datamodel AWT, Swing, JavaFX & SWT 2
M TableView Zeile hinzufügen AWT, Swing, JavaFX & SWT 5
Bluedaishi TableView mit Combox wert wird nicht in die TableView gesetzt AWT, Swing, JavaFX & SWT 38
J TableView Update/Refresh CPU AWT, Swing, JavaFX & SWT 2
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
J Tableview - kann man mit Enter die Zellen wechseln AWT, Swing, JavaFX & SWT 1
ralfb1105 JavaFX Dynamisch TableView Spalten erstellen AWT, Swing, JavaFX & SWT 4
M TableView + Datenbank Aktualisierung AWT, Swing, JavaFX & SWT 4
B TableView als PDF speichern AWT, Swing, JavaFX & SWT 8
B JavaFX TableView eine Zeile markieren AWT, Swing, JavaFX & SWT 5
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
L JavaFX TableView Column Sortierung AWT, Swing, JavaFX & SWT 1
L Java FX Keine Anzeige Im Tableview AWT, Swing, JavaFX & SWT 4
L JavaFX TableView kein content text ändern AWT, Swing, JavaFX & SWT 2
L JavaFX TableView mit Aktionenbuttons AWT, Swing, JavaFX & SWT 1
C JavaFX Edit TableView in Verbindung mit SceneBuilder AWT, Swing, JavaFX & SWT 1
C JavaFX ProGuard -> TableView kein Inhalt AWT, Swing, JavaFX & SWT 7
J SceneBuilder TableView Checkbox AWT, Swing, JavaFX & SWT 1
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
F JavaFX (Tree)TableView korrekt drucken AWT, Swing, JavaFX & SWT 1
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
G JavaFX TableView Wert in Spalte ändern AWT, Swing, JavaFX & SWT 0
S JavaFx - ausgewählte Rows in Arraylist (Tableview) AWT, Swing, JavaFX & SWT 4
S JavaFX - Populate TableView AWT, Swing, JavaFX & SWT 2
N JavaFX TableView aus Map AWT, Swing, JavaFX & SWT 2
B JavaFX TableView aus Collection befüllen AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
zhermann TableView die zweite AWT, Swing, JavaFX & SWT 7
H Java FX List<AlbumsBean> in FXML TableView AWT, Swing, JavaFX & SWT 37
E JavaFX TableView mit Zeilenumbruch in Zellen AWT, Swing, JavaFX & SWT 5
zhermann TableView wird nicht gefüllt AWT, Swing, JavaFX & SWT 14
M JavaFX JavaFX ResultSet in TableView ausgeben AWT, Swing, JavaFX & SWT 2
W JavaFX Mehrere Klassen in ein TableView AWT, Swing, JavaFX & SWT 6
MaxG. JavaFX Inhalt in Tableview wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
M JavaFX berechneten Wert in TableView schreiben AWT, Swing, JavaFX & SWT 1
K JavaFX Message in TableView AWT, Swing, JavaFX & SWT 2
H TableView mit variabler Anzahl Spalten AWT, Swing, JavaFX & SWT 2
L JavaFX List oder TableView Größe dynamisch anpassen? AWT, Swing, JavaFX & SWT 4
L JavaFX TableView mit Excelfunktion AWT, Swing, JavaFX & SWT 1
D JavaFX TableView AWT, Swing, JavaFX & SWT 2
L JavaFX TableView mit XYChart verbinden AWT, Swing, JavaFX & SWT 3
blazingblade JavaFX Tableview Clock Column update AWT, Swing, JavaFX & SWT 5
P JavaFX, TableView und Datenbank AWT, Swing, JavaFX & SWT 4
K TableView: 'Komplexes' Object AWT, Swing, JavaFX & SWT 11
L JavaFX TableView background transparent machen AWT, Swing, JavaFX & SWT 7
F TableCell aus TableView holen AWT, Swing, JavaFX & SWT 8
K JavaFX TableView mit Rectangle AWT, Swing, JavaFX & SWT 3
M Befüllung der einzelnen Zeilen des TableView AWT, Swing, JavaFX & SWT 3
N JavaFX TableView füllt nicht das gesamte ScrollPanle aus AWT, Swing, JavaFX & SWT 2
M JavaFX TableView & CSS, Rand um Tabellenkopf entfernen AWT, Swing, JavaFX & SWT 3
L JavaFX ListView oder TableView Style überschreiben? AWT, Swing, JavaFX & SWT 6
J JavaFX TableView - Höhe der Zeilen AWT, Swing, JavaFX & SWT 3
L JavaFX TableView mit Attributs der Modellreferenzerierung für die Spalte AWT, Swing, JavaFX & SWT 3
I JavaFX Buttons und TableView AWT, Swing, JavaFX & SWT 2
J JavaFX Bestimmte Zellen im TableView ändern (Farbe und Text) AWT, Swing, JavaFX & SWT 1
B Java FX TableView Zeilen mit verschiedenen Typen AWT, Swing, JavaFX & SWT 15
Z JavaFX TableView cellValueFactory für Arrays AWT, Swing, JavaFX & SWT 2
E JavaFX TableView mit Rechtsklick Zelle auswählen AWT, Swing, JavaFX & SWT 8
C (JavaFX 8) SQLite Datenbank in einem TableView darstellen AWT, Swing, JavaFX & SWT 2
D JavaFX TableView bleibt leer. AWT, Swing, JavaFX & SWT 8
M JavaFX TableView nach Spalte sortieren AWT, Swing, JavaFX & SWT 1
P JavaFX Dynamische TableView AWT, Swing, JavaFX & SWT 14
V Java FX POJO aus Datenbank in FX TableView / Best Practice AWT, Swing, JavaFX & SWT 0
P JavaFX TableView Item hinzufügen AWT, Swing, JavaFX & SWT 20
W JavaFX TableView frage AWT, Swing, JavaFX & SWT 5
M JavaFX Tutorial zu Tableview AWT, Swing, JavaFX & SWT 5
C JavaFX Zugriff auf TableView AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben