Unvollständige Daten in der TableView

Tacoma

Mitglied
Hallo Community,


ich habe eine SQLite DB mit 5 Columns und 3 Rows Testdaten. Ich versuche, diese bestehende Daten in der DB in einer TableView darzustellen.


Folgenden Code habe ich getestet.
Java:
        data = FXCollections.observableArrayList();
        try {
            //c = SqliteConnect.SQLiteConnection();
            Connection connection = DatabaseConnection.getConnection();
            String SQL = "SELECT * from spiritlog";
            ResultSet rs = connection.createStatement().executeQuery(SQL);

            for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
                final int j = 1;
                TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i + 1));
                col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList, String>, ObservableValue<String>>() {
                    public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {
                        return new SimpleStringProperty(param.getValue().get(j).toString());
                    }
                });
                tableView.getColumns().addAll(col);
                System.out.println("Column [" + i + "]");
            }
            while (rs.next()) {
                ObservableList<String> row = FXCollections.observableArrayList();
                for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
                    row.add(rs.getString(i));
                }
                System.out.println("Row [1] added " + row);
                data.add(row);
            }
            tableView.setItems(data);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Error on Building data");
        }

Wenn ich dies laufen lasse, erhalte ich in der TableView die korrekte Darstellung der Felderbeschreibung / Überschrift. Es wird mir im Inhalt jedoch für alle 5 Columns der Wert der 2. Column angezeigt. Siehe Screeshot.Screenshot 2024-07-04 at 11.15.02.png


In der IntelliJ IDE sehe ich im Ausgabefenster die korrekten Daten für jede Row.

Code:
Row [1] added [testdate1, testtime1, testvallue1, testtag1, testcomment1]
Row [1] added [testdate2, testtime2, testvalue2, testtag2, testcomment2]
Row [1] added [testdate3, testtime3, testvalue3, testtag4, testcomment4]


Was habe ich falsch gemacht?
 

Tacoma

Mitglied
Eine Frage hierzu habe ich noch.

Gibt es eine Dokumentation, die das mit dem neuen Row-Object beschreibt, sodass man das auch als Anfänger nachvollziehen kann. In den Code Beispielen, wo man sich das herholt, gibt es keinen Hinweis auf ein neues Row-Object. Trotzdem wird dann so ein Code Beispiel als passend markiert.
 

KonradN

Super-Moderator
Mitarbeiter
Also Oracle hat da eigentlich brauchbare Dokumentation. Ich selbst würde auch nicht so mit den ArrayListen für die Werte arbeiten. Der Weg, den ich für üblich halte, ist immer: Daten sauber strukturieren. Dann hast Du eine ObservableList von den Entities von Dir. Und diese Daten werden dann angezeigt, wie es z.B. bei:
Using JavaFX UI Controls: Table View | JavaFX 2 Tutorials and Documentation (oracle.com)
gezeigt wird.

Dann hast Du das Problem auch sauber in Teilprobleme zerlegt. Bei Dir wäre es z.B. das Lesen der Daten aus der Datenbank und dann separat davon die Anzeige in einer Table.

Und wenn ich Deinen Code ansehe, dann ist das Problem doch nicht wie von @LimDul beschrieben. Du erzeugst doch in der Schleife immer das row Objekt neu.

Wenn ich Dich aber richtig verstanden habe, ist Dein Problem, dass Du in allen Spalten immer die testtime angezeigt bekommst. Aber das ist doch auch klar, denn in der CellValueFactory nimmst immer das Element 1 (final int j = 1) aus dem row Array.
 

KonradN

Super-Moderator
Mitarbeiter
Jetzt beim erneuten Hineingehen verstehe ich auch den Fehler. Ich hatte mich über das j = 1 gewundert - Da hast Du evtl. einen Kopier oder Abtipp Fehler:
Zeile 9 sollte vermutlich ein final int j = i; sein.

Hintergrund: Du gehst die Spalten durch. dazu hast Du die Schleife mit dem i. Aber das i kannst Du nicht in der anonymen inneren Klasse verwenden. Da muss es ein (pseudo) final Wert sein. Dazu wird das i in der lokalen final Variable j gespeichert. Und schon stimmt auch der Zugriff auf den Wert des Arrays.

Aber so Fehler sind schwer zu sehen, wenn der Code so unstrukturiert ist. Daher wäre es auf jeden Fall sinnvoll, den Code besser zu strukturieren und die Werte einer Zeile nicht einfach in einer String List zu speichern.
 

Tacoma

Mitglied
Jetzt beim erneuten Hineingehen verstehe ich auch den Fehler. Ich hatte mich über das j = 1 gewundert - Da hast Du evtl. einen Kopier oder Abtipp Fehler:
Zeile 9 sollte vermutlich ein final int j = i; sein.

Hintergrund: Du gehst die Spalten durch. dazu hast Du die Schleife mit dem i. Aber das i kannst Du nicht in der anonymen inneren Klasse verwenden. Da muss es ein (pseudo) final Wert sein. Dazu wird das i in der lokalen final Variable j gespeichert. Und schon stimmt auch der Zugriff auf den Wert des Arrays.

Aber so Fehler sind schwer zu sehen, wenn der Code so unstrukturiert ist. Daher wäre es auf jeden Fall sinnvoll, den Code besser zu strukturieren und die Werte einer Zeile nicht einfach in einer String List zu speichern.

Vielen Dank für die Lösung aber auch für die Erklärung. Als Anfänger habe ich mich mit der TableView schwer getan und war froh, überhaupt einen Lösungsansatz zu haben.

Java:
final int j = i;

Damit funktioniert es 😇

Ist der Code aus der o.a. Oracle Dokumentation eher geeignet oder gibt es hier noch eine "bessere" Lösung?
 

KonradN

Super-Moderator
Mitarbeiter
Hier wäre meine Frage: Was verstehst Du unter besser geeignet?

Aus meiner Sicht ist es auf jeden Fall besser geeignet, da Du eine bessere Trennung der einzelnen Teile hättest. Die Idee ist, dass Du diverse Aufgaben jeweils etwas gekapselt hättest:
  • Die Daten und was da direkt dazu gehört (Also z.B. das Lesen der Daten aus der Datenbank) Dabei ist wichtig: Die Daten liegen in einem natürlichen Datenformat vor. Du hast also nicht alles Strings.
  • Die reine Anzeige ist davon losgelöst.
  • In der Anzeige hast Du dann separat auch die Formatierungen. Also wie soll z.B. das Datum formatiert werden?

Wenn Du diese Aufteilung hast, dann ist in der Regel jede Teil für sich testbar. Änderungen sind dann auch einfach durchzuführen, denn Du kannst das dann zentral haben. (Also z.B. definierst Du nur einmal, die das Format sein soll und nutzt das dann an allen Stellen, Wo Du ein Datum anzeigst.)


ABER: Ich weiss jetzt im Augenblick nicht sicher, ob es für Dich tauglich sein kann, denn ich kenne Deine Anforderungen nicht.

Im Augenblick hast Du Code, der das Ergebnis einer beliebigen Query, anzeigen kann. Wenn Du nicht weisst, was für Daten Du anzeigen wirst, dann kannst Du natürlich auch keine Datenklassen dafür haben. Und dann fällt das, was in dem Link von mir gezeigt wird, natürlich flach. Je nach Anforderungen würde ich es dort aber dann auch etwas mehr kapseln, aber das ist dann nicht mehr eine 1:1 Übernahme von dem Code.

Aber normalerweise hast Du ja ein konkretes Datenbankschema in Deiner Anwendung und dann hast Du das Datenmodell in Java. Also hier hättest Du evtl. eine Klasse LogEntry mit den entsprechenden Feldern. Und dann hättest du eine andere Klasse, die dafür zuständig ist, die LogEntry Daten aus der Datenbank zu laden (oder zu speichern). Das wäre dann sozusagen das Model. Dann ist die Frage: Was für ein Pattern will man für die Anzeige verwenden? MVC und MVVM sind da mit am verbreitetsten. Da könntest Du Dir das MVC Pattern evtl. einmal näher ansehen.

Hier ist aber auch wichtig: Wie tief willst Du Dich hinein knien? Was willst Du da bauen? Wie komplex wird das? Es kommen halt hier sehr schnell sehr viele Themen ins Spiel...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
scratchy1 vollständige und unvollständige Arrays ausgeben Java Basics - Anfänger-Themen 11
H Eclipse , Design-Modus, unvollständige Darstellung Java Basics - Anfänger-Themen 0
G Exception - Unvollständige Eingabe im Textfeld Java Basics - Anfänger-Themen 2
B unvollständige Anzeige von JComboBox Werten Java Basics - Anfänger-Themen 5
S Daten aus Import Datei auslesen und sortieren Java Basics - Anfänger-Themen 2
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
Mady Daten von JList & Combobox in JTable adden Java Basics - Anfänger-Themen 2
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
W Daten in Echtzeit übernehmen Java Basics - Anfänger-Themen 5
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
E fehlermeldung bei richtigen login daten Java Basics - Anfänger-Themen 7
C Java Funktion: externe Daten vom Internet einbinden Java Basics - Anfänger-Themen 2
P Schiebefix - ArrayList überschreibt Daten Java Basics - Anfänger-Themen 3
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
M Tabellen- Daten laden Java Basics - Anfänger-Themen 2
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A Literale für primitive Daten Typen Java Basics - Anfänger-Themen 4
N Zwei Daten (Datum) miteinander vergleichen, abspeichern, laden Java Basics - Anfänger-Themen 4
A Daten auslesen/vergleichen Java Basics - Anfänger-Themen 3
D Sportwetten Daten Atomatisch analysieren um optimale Strategie zu erhalten Java Basics - Anfänger-Themen 6
S Java Daten in Excel speichern Java Basics - Anfänger-Themen 1
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Daten aus ArrayList in Datenbank durchsuchen Java Basics - Anfänger-Themen 5
Shallty Daten speichern und ändern? Java Basics - Anfänger-Themen 32
M Sqlite table löschen und daten einfügen Java Basics - Anfänger-Themen 5
S Binäre-Suche bei unsortierten Daten Java Basics - Anfänger-Themen 7
N Was passiert wenn wir Daten auf der Festplatte abspeichern wollen? bzgl. BufferStreams Java Basics - Anfänger-Themen 9
T Daten von Objekten speichern Java Basics - Anfänger-Themen 7
A Minesweeper - Daten Java Basics - Anfänger-Themen 46
A Eingelesene Daten in Array(Liste) abspeichern? Java Basics - Anfänger-Themen 18
S Daten aus zwei Verschiedenen Tabellen in eine ArrayListe Java Basics - Anfänger-Themen 4
WPS1000 Input/Output Wie aktiviere ich den Daten Transfer von der RS232 in meine Java Applikation Java Basics - Anfänger-Themen 2
R Eigenes Protokoll zur Übermittlung von Daten zum Webserver? Java Basics - Anfänger-Themen 4
A Reader wohin werden Daten gespeichert? Java Basics - Anfänger-Themen 7
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
S Daten aus eigenständiger .class-Datei abrufen Java Basics - Anfänger-Themen 1
E Daten dem Super Aufruf übergeben Java Basics - Anfänger-Themen 3
M jTabel mit Daten Füllen Java Basics - Anfänger-Themen 5
M Wie erzeuge ich die Differenz von zwei Daten in Stunden?? Java Basics - Anfänger-Themen 2
S Daten lesen und speichern Java Basics - Anfänger-Themen 26
S JTable mit Daten füllen Java Basics - Anfänger-Themen 7
L Java Programm zum Auswerten von Daten Java Basics - Anfänger-Themen 11
H Passwortmanager, Sicherheit der Daten Java Basics - Anfänger-Themen 12
G Best Practice Wie große "Tabellen" effizient durchsuchen und Daten händeln? Java Basics - Anfänger-Themen 15
U Daten aus Datei einlesen Java Basics - Anfänger-Themen 4
M Best Practice Daten-Import /Trabsfomration aus Textdatei Java Basics - Anfänger-Themen 12
R JTable Suchfunktion mit SQL Daten Java Basics - Anfänger-Themen 2
E Daten gehen nicht in Datenbank Java Basics - Anfänger-Themen 14
M Erste Schritte Speichern von mehreren Daten Java Basics - Anfänger-Themen 3
J Daten einer Textdatei in ein JTable importieren. Java Basics - Anfänger-Themen 3
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
N Erste Schritte Dedicated Server \ Senden und Empfangen von Daten/Befehlen Java Basics - Anfänger-Themen 2
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
D NPE beim laden von Daten aus MySQL Java Basics - Anfänger-Themen 9
P Einlesen von Daten via BufferedReader Java Basics - Anfänger-Themen 4
P Methoden ausgelesene (CSV-) Daten in Liste einer anderen Klasse einlesen Java Basics - Anfänger-Themen 0
F Daten aus Excel-Tabelle in Java importieren Java Basics - Anfänger-Themen 15
F Http Post von mehreren Daten Java Basics - Anfänger-Themen 5
F Daten auf Webserver laden - wiederholen bei Fehler Java Basics - Anfänger-Themen 0
W Best Practice problemabhängige Persistentmachung von Daten Java Basics - Anfänger-Themen 6
P Daten von Internetseite auslesen Java Basics - Anfänger-Themen 10
N Daten/Formular per POST an Firefox/Browser senden Java Basics - Anfänger-Themen 7
D Daten mit Apache POI in eine Excel Datei schreiben Java Basics - Anfänger-Themen 5
T JTable Daten aus txt datei Java Basics - Anfänger-Themen 3
T printf Daten aus der Tabelle in Excel übernehmen Java Basics - Anfänger-Themen 5
P zweidimensionales Array anlegen und mit DB-Daten füllen Java Basics - Anfänger-Themen 14
V Einlesen von Daten Java Basics - Anfänger-Themen 8
J TableView zeigt keine Daten an Java Basics - Anfänger-Themen 14
J Daten im Programm speichern Java Basics - Anfänger-Themen 14
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
O Probleme mit CSV Daten Java Basics - Anfänger-Themen 10
M Arrays: Trennung von Daten und Darstellung Java Basics - Anfänger-Themen 1
S Daten aus Array in Klasse übertragen Java Basics - Anfänger-Themen 12
M Wie sicher sind Daten im Java Programm? Java Basics - Anfänger-Themen 9
R Daten via Post an php Script senden Java Basics - Anfänger-Themen 1
B Probleme bei "Daten in CSV File schreiben". Java Basics - Anfänger-Themen 9
C Datei mit Daten einlesen und höchsten wert der zweiten Spalte ermitteln Java Basics - Anfänger-Themen 1
W (XML/XSL) Daten aus Eclipse in eine Klasse Laden. Java Basics - Anfänger-Themen 1
I Daten speichern ohne Datenbank Java Basics - Anfänger-Themen 20
D Daten von einem int in einen string Java Basics - Anfänger-Themen 5
L Daten aus Array Feld löschen Java Basics - Anfänger-Themen 2
T Input/Output Daten/Objekte einfach speichern Java Basics - Anfänger-Themen 5
IngoF GUI mit Thread Daten austauschen. Java Basics - Anfänger-Themen 6
S Daten aus anderen Dateien in neue Datei einlesen Java Basics - Anfänger-Themen 3
fLooojava Daten im selben Netzwerk an IP Java Basics - Anfänger-Themen 1
M Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern Java Basics - Anfänger-Themen 3
K HashMap mit Daten aus ArrayList befüllen Java Basics - Anfänger-Themen 14
P Daten auslesen und in CSV speichern Java Basics - Anfänger-Themen 6
J Daten aus zweiter Klasse importieren Java Basics - Anfänger-Themen 33
C Daten speichern und laden Java Basics - Anfänger-Themen 6
S Je nach erhaltene Daten unterschiedlich reagieren (Design Pattern?) Java Basics - Anfänger-Themen 3
J Daten von einer PHP Datei ablesen Java Basics - Anfänger-Themen 1
B Klassen Zugriff auf Daten der Child-Klasse Java Basics - Anfänger-Themen 9
K Daten (im Sinne von Datum) aus Webseiten extrahieren Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben