Tabelle wird nicht richtig dargestellt

GhostfaceChilla

Bekanntes Mitglied
Hallo Leute.
Mein Programm soll Daten aus einer Datenbank laden. Diese Daten werden in ein Objekt gespeichert,welches dann in einer TableView angezeigt wird.(JavaFX)
Aber hier mal mein Code das man auch versteht was ich meine:

Die Musik Klasse.Diese beinhaltet die Daten die in der Tabelle angezeigt werden sollen.
Java:
public class Music {
    
    public static int idFinally;
    private SimpleIntegerProperty id = new SimpleIntegerProperty();
    private SimpleStringProperty titel = new SimpleStringProperty();
    private SimpleStringProperty playtime = new SimpleStringProperty();
    private SimpleStringProperty interpret = new SimpleStringProperty();
    private SimpleStringProperty album = new SimpleStringProperty();
    private SimpleStringProperty genre =  new SimpleStringProperty();
    private SimpleDoubleProperty score = new SimpleDoubleProperty();

    public Music(int id, String titel,String playtime, String interpret,
                    String album, String genre, double score) {
        setId(id);
        setTitel(titel);
        setPlaytime(playtime);
        setInterpret(interpret);
        setAlbum(album);
        setGenre(genre);
        setScore(score);
    }

    public int getId(){
        return id.get();
    }
    
    public void setId(int id){
        this.id.set(id);
    }
    
    public String getTitel() {
        return titel.get();
    }

    public void setTitel(String titel) {
        this.titel.set(titel);
    }

    public String getPlaytime() {
        return playtime.get();
    }

    public void setPlaytime(String playtime) {
        this.playtime.set(playtime);
    }

    public String getInterpret() {
        return interpret.get();
    }

    public void setInterpret(String interpret) {
        this.playtime.set(interpret);
    }

    public String getAlbum() {
        return album.get();
    }

    public void setAlbum(String album) {
        this.playtime.set(album);
    }

    public String getGenre() {
        return genre.get();
    }

    public void setGenre(String genre) {
        this.playtime.set(genre);
    }

    public Double getScore() {
        return score.get();
    }

    public void setScore(double score) {
        this.score.set(score);
    }
    
    
    
}

Dann die Klasse die eine Verbindung zur Datenbank aufbaut:
Java:
public abstract class DatabaseConnector {

    private static Connection connection;

    public static Connection getConnection() {
        return connection;
    }

    public static void setConnection(Connection con) {
        DatabaseConnector.connection = con;
    }
    
    /**
     * Methode um eine Verbindung mit einer Datenbank aufzubauen.
     * @param dbName Name der zu ladenden Datenbank
     * @throws NamingException
     * @throws SQLException 
     * @throws java.lang.ClassNotFoundException 
     */
    public static void connectTo(String dbName) throws NamingException, SQLException, ClassNotFoundException{
        Class.forName("org.hsqldb.jdbc.JDBCDriver");
        setConnection(DriverManager.getConnection("jdbc:hsqldb:file:src/mediabox/database/database;shutdown=true", "", ""));
    }
    
    /**
     * 
     * @return Gibt die geladenen Zeilen in Form einer ArrayList zurück
     * @throws SQLException
     * @throws ConnectionException Fehlermeldung, falls zuvor nicht die @connectTo Methode aufgerufen wurde
     */
    public static ArrayList loadEntries() throws SQLException, ConnectionException{
        if(connection != null){
            Statement statement = connection.createStatement();
            ResultSet rs = statement.executeQuery("SELECT * FROM MUSIC");
            ArrayList entries = new ArrayList();
            while(rs.next()){
                Music m = new Music(rs.getInt(1), rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6),
                                    rs.getDouble(7));
                entries.add(m);
            }
            return entries;
        }
        else{
            throw new ConnectionException("Es besteht keine Verbindung zur "
                    + "Datenbank. <ERROR : line 47, DatabaseConnector");
        }
            
    }
}

Und zu guter letzt noch die View:
Code:
<TableView fx:id="libraryNode" editable="true" xmlns:fx="http://javafx.com/fxml">
    <columns>
        <TableColumn text="Index" >
            <cellValueFactory>
                <PropertyValueFactory property="id" />
            </cellValueFactory>
        </TableColumn>
        <TableColumn text="Titel" >
            <cellValueFactory>
                <PropertyValueFactory property="titel" />
            </cellValueFactory>
        </TableColumn>
        <TableColumn text="Dauer" >
           <cellValueFactory>
               <PropertyValueFactory property="playtime" />
           </cellValueFactory> 
        </TableColumn>
        <TableColumn text="Interpret" >
            <cellValueFactory>
                <PropertyValueFactory property="interpret" />
            </cellValueFactory>
        </TableColumn>
        <TableColumn text="Album" >
            <cellValueFactory>
                <PropertyValueFactory property="album" />
            </cellValueFactory>
        </TableColumn>
        <TableColumn text="Genre" >
           <cellValueFactory>
               <PropertyValueFactory property="genre" />
           </cellValueFactory> 
        </TableColumn>
        <TableColumn text="Bewertung" >
           <cellValueFactory>
                <PropertyValueFactory property="score" />
           </cellValueFactory> 
        </TableColumn>
    </columns>
</TableView>

Nun ist mein Problem das die Daten nicht richtig angezeigt werde. Es wird komischerweise nur die ID und der Titel richtig angezeigt und am ende die Bewertung. Unter Dauer steht dann z.B Horror, dabei würde das unter Genre gehören
Ich finde den Fehler nicht. Mir ist aufgefallen wenn ich die DB nur bis zu Spalte 3 also Dauer auslese, wird die Dauer auch richtig angezeigt.Aber sobald ich alle Spalten einlese steht unter Dauer immer Horror :/
Jemand ne Idee?Ich finde den Fehler nicht....

-GhostfaceChilla-
 
Nun ist mein Problem das die Daten nicht richtig angezeigt werde. Es wird komischerweise nur die ID und der Titel richtig angezeigt und am ende die Bewertung. Unter Dauer steht dann z.B Horror, dabei würde das unter Genre gehören
Ich finde den Fehler nicht. Mir ist aufgefallen wenn ich die DB nur bis zu Spalte 3 also Dauer auslese, wird die Dauer auch richtig angezeigt.Aber sobald ich alle Spalten einlese steht unter Dauer immer Horror :/
Jemand ne Idee?Ich finde den Fehler nicht....

Hört sich ganz danach an das du die Daten in der falschen Reihenfolge in dein Objekt packst!
Überschreibe die toString() Methode deiner Music Klasse und gib in der Methode "loadEntries" jedes der Music Objekte auf der Konsole aus sobald es mit Daten der DB erstellt wurde.

Sind hier die Daten richtig?
Ich glaube dein SELECT verursacht den Fehler, ersetze das "*" im SELECT durch alle Spalten in der benötigten Reihenfolge!
 
Also die Reihenfolge müsste stimmen. Auch das SELECT ist nicht das Problem, da ich alle Zeilen in das ResultSet lade und mit ResultSet.next so lange die Zeilen durchgehe bis es keine mehr gibt. Und mit get(x), erfrage ich die Spalte in der jeweiligen Zeile.
Und das ist meine Ausgabe auf der Konsole:

1
Was geeeht?
1:44
null
null
null
4.0

Die Ausgabe findet in der Music Klasse statt. Führe ich die Ausgabe in der DatabaseConnector Klasse aus durch rs.get(x) dann bekomme iich diese Ausgabe:
1Was geeeht? 1:44 Hallo OK GRUSEL 4.0

Das stimmt auch also werden die Daten richtig auser Datenbank ausgelesen, d.h es muss ein Fehler inder Music Klasse sein. Ich glaube ich gucke mir das Prinzip der SimpleXXXProperties nochmal etwas genauer an, vllt. habe ich da einen Fehler gemacht.

-GhostfaceChilla-
 
Zuletzt bearbeitet:
Also die Reihenfolge müsste stimmen. Auch das SELECT ist nicht das Problem, da ich alle Zeilen in das ResultSet lade und mit ResultSet.next so lange die Zeilen durchgehe bis es keine mehr gibt. Und mit get(x), erfrage ich die Spalte in der jeweiligen Zeile.

Wenn du beim Anlegen deiner Datenbanktabelle die Reihenfolge der Spalten anders angegeben hast wie du sie nun auslesen willst kann es vorkommen das die Werte dann natürlich vertauscht sind.
Außerdem ist ein "SELECT *" von der Performance her langsamer als ein "SELECT [Spalte1], [Spalte2], ..... , [SpalteN]".
Bei diesem Minimalbeispiel macht es zwar nicht viel aus, aber besser gleich angewöhnen!

Und das ist meine Ausgabe auf der Konsole:
1
Was geeeht?
1:44
null
null
null
4.0

Da wo null steht müssten lauter Strings stehen. Ich kapier es einfach nicht. Ich muss den Code nochmal richtig analysieren 🙂

Schön nun weiß ich deine Konsolenausgaben, nur wo du nun was am Code geändert hast zeigst du mir nicht.
Also bitte auch deine Änderungen am Code zeigen.
 
Java:
while(rs.next()){
                Music m = new Music(rs.getInt(1), rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6),
                                    rs.getDouble(7));
                System.out.println(rs.getInt(1) + rs.getString(2) +rs.getString(3)+rs.getString(4)+rs.getString(5)+rs.getString(6)+
                                    rs.getDouble(7));
                entries.add(m);
            }
            return entries;

Ich habe nur diese Konsolenausgabe hineingebracht und da werden die Elemnte korrekt ausgegegebn. D.h die Daten wurden auch in der richtigen Reihenfolge geladen.

-GhostfaceChilla-
 
Schau dir die setter Methoden deiner Klasse mal an.
Du hast nur einen dummy Copy&Paste Fehler drinnen :lol:

setInterpret, setAlbum und setGenre sind betroffen
 
Zuletzt bearbeitet:
Mich wundert ja fast eher, das überhaupt was angezeigt wird, da du die "<propName>Property()"-Methode nicht in deiner Modellklasse mit angegeben hast...
 
Vielen dank Joose 😀

Mich wundert ja fast eher, das überhaupt was angezeigt wird, da du die "<propName>Property()"-Methode nicht in deiner Modellklasse mit angegeben hast...

Braucht man die überhaupt?Ich habe mir diverse Seiten für die Erstellung der TableView via fxml und das Füllen der Tabelle angeguckt und nirgends war etwas über diese Methode gestanden:shock:

-GhostfaceChilla-
 
Soweit ich weiss: Ja. Aber da es bei dir geht, mach dir da erst mal nicht so die Rübe. 🙂

Grundsätzlich aber ist es sinnvoll den dritten "getter" zu haben, wenn du mal selbst Änderungen am Modell überwachen möchtest (z.B., auch wenn das jetzt vielleicht nicht de eleganteste Lösung wäre, wenn du ein Feld editierst - kommt ja mitunter vor, oder? - dann kannst du direkt ein DB-update machen).
 
Zuletzt bearbeitet:
Ok das werde ich berücksichtigen 🙂
Ja man kann die Tabelle editieren aber noch nicht in dieser Version.Da alles über eine Fernbedienung gesteurt wird, wird das mit dem editieren und so noch etwas warten müssen, bis die Fernebdienung auch kompleet richtig funktioniert.

-GhostfaceChilla-
 

Neue Themen


Zurück
Oben