Jtable wird nicht angezeigt

heybiy

Grünschnabel
Hallo Leute..
brauche dringend Hilfe. Versuche die ganze Zeit aus einer TXT Datei eine JTable aufzufüllen. Die Daten in werden in einem Vector gespeichert. Klappt auch alles..hab ich auch schon ausgeben lassen. Jedoch wird in dem Frame die JTable nicht angezeigt!!
Ich möchte das die Einträge in der Textdatei als Zeile in die JTable übernommen wird..
Kann mir bitte jemand helfen Eine andere Frage ist wofür brauch ich ein Table-Model Brauch ich es in dem Fall überhaupt
Vielen Dank für eure Hilfe im Voraus!
Gruß heybiy


Java:
package jtable;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;
 
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
 
public class Notenuebersicht extends AbstractTableModel {
 
    
    Vector test = new Vector();
    
    
    public Notenuebersicht(){
        try {
            ladeDaten();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        columnNames.add("Fach");
        columnNames.add("Semester");
        columnNames.add("Note");
    }
    
    
    public Vector ladeDaten() throws IOException {
        
        File daten = new File("C:/Projekt/test.txt");
        
        String zeile ;
        
        FileReader fr = new FileReader (daten);
        
        BufferedReader br = new BufferedReader (fr);
            if(daten.length() != 0){
                while ( (zeile = br.readLine()) != null) {
                    test.add(zeile);
                }
            }
            else{
                test.add("Noch keine Namen eingetragen");
            }
                br.close();
                return test;
    }
    
    
    private Vector<String> columnNames = new Vector<String>();
    
    
    JTable table = new JTable(test,columnNames);
    
    
    
    
    public int getColumnCount() { // Anzahl der Spalten
        return 3;
    }
 
    @Override
    public int getRowCount() {    //Anzahl der Zeilen
        return test.size();
        }
 
    @Override
    public Object getValueAt(int arg0, int arg1) { //Inhalt an der Stelle zurückgeben
        return null;
    }
 
    
}
__________________________________________________________________

Java:
package jtable;
 
import javax.swing.JFrame;
import javax.swing.JScrollPane;
 
public class Frame extends JFrame {
 
    
    JFrame f;
    Notenuebersicht nu;
    
    public Frame(){
        
        nu=new Notenuebersicht();
        
        f = new JFrame();
        f.setSize(800, 500);
        f.setTitle("Probe JTable");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(nu.table);
        f.add( new JScrollPane(nu.table) );
        f.repaint();
        //JScrollPane.setViewportView(nu.table);
        
        f.setLocationByPlatform(true);
        f.setAlwaysOnTop(true);
        f.pack();
        f.setVisible(true);
        
    }
    
    
    
    
    
    
    
    public static void main(String[] args) {
        new Frame();
    
    }
 
Zuletzt bearbeitet von einem Moderator:

zeja

Erfahrenes Mitglied
Ui das ist noch ein ganz schönes Chaos. Ist nicht böse gemeint :)

Erstmal ist deine table ein Feld und du erstellst sie damit auch schon direkt wenn ein Objekt von Notenübersicht erstellt wird. Zu dem Zeitpunkt ist dein Vector columnNames aber noch leer. Daher werden keine Spalten erstellt. Erstelle deine Tabelle also erst nachdem du die Spaltennamen festgelegt hast: this.table = new JTable(test, columnNames);

Dann kommt das zweite Problem: test muss ein Vector sein, der wiederum Vectoren enthält. Prinzip ist dabei, dass der äußere Vektor die Zeilen der Tabelle darstellt. Jede Zeile ist wieder ein Vektor mit den einzelnen Zellen der Tabelle.

Wie sieht denn die Textdatei aus die du einliest? Die Zeile musst du entsprechend dann noch unterteilen und in einen Vektor hinzufügen. Ich hoffe das war verständlich..
 

heybiy

Grünschnabel
Hallo Zeja..

vielen Dank für deine Antwort.:)
also..kann schon so ein bisschen verstehen was du meinst..solltest mir aber noch ein bisschen in die Sprünge helfen..:))

Die Testdatei ist eine normale Liste und sieht wie folgt aus..

Mathe
Deutsch
Englisch
.
.

Kannst du mir vllt noch ein paar tipps geben was genau ich an meinem code ändern soll..und wo?

Vieeeeelen Dank!!
gruß
 

zeja

Erfahrenes Mitglied
Das mit dem Konstruktor hab ich ja geschrieben. Beim einlesen der Datei

statt test.add(zeile);

Java:
Vector data = new Vector(); // besser Vector<String> data = new Vector<String>();
data.add(zeile);
test.add(data);

Achte bitte auf eine etwas bessere Benennung deiner Variablen und mische möglichst kein Englisch und Deutsch. Vorzugsweise eher Englisch.
 

heybiy

Grünschnabel
ok das hab ich jetzt so geändert...
bloß was meintest du genau mit dem Konstruktor..wo und wann soll ich genau JTable erstellen
 

heybiy

Grünschnabel
so sieht es nun aus..

package jtable;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;

import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Notenuebersicht extends AbstractTableModel {


Vector test = new Vector();


public Notenuebersicht(){
try {
ladeDaten();
} catch (IOException e) {
e.printStackTrace();
}

columnNames.add("Fach");
columnNames.add("Semester");
columnNames.add("Note");
}


public Vector ladeDaten() throws IOException {

File daten = new File("C:/Projekt/test.txt");

String zeile ;
Vector<String> data = new Vector<String>();


FileReader fr = new FileReader (daten);

BufferedReader br = new BufferedReader (fr);
if(daten.length() != 0){
while ( (zeile = br.readLine()) != null) {
data.add(zeile);
test.add(data);
}
}
else{
test.add("Noch keine Namen eingetragen");
}
br.close();
return test;
}


private Vector<String> columnNames = new Vector<String>();


JTable table = new JTable(test,columnNames);




public int getColumnCount() { // Anzahl der Spalten
return 3;
}

@Override
public int getRowCount() { //Anzahl der Zeilen
return test.size();
}

@Override
public Object getValueAt(int arg0, int arg1) { //Inhalt an der Stelle zurückgeben
return null;
}


}

________________________________________________________________

In der Frame Klasse muss ich nichts ändern oder?
 

zeja

Erfahrenes Mitglied
Benutze doch bitte die Java-Tags in deinen Beiträgen, so wie ich das oben in deinem auch gemacht habe.

Du musst das erstellen des JTable Objektes noch in den Kontruktor packen. Und in der while-Schleife beim Auslesen immer einen neue data-Vector erstellen.

Das TableModel brauchst du übrigens nicht implementieren. Das kannst du alles weglassen.

Ist das ne Aufgabe die du programmieren musst? Es ist für den Anfang nicht unbedingt das einfachste direkt mit graphischen Oberflächen anzufangen.
 

heybiy

Grünschnabel
ok...jetzt kann ich die Tabelle sehen..

doch jetzt steht in jeder Spalte ein Eintrag von der Textdatei 5 mal..?:confused:
Woran kann das liegen?
 

Anhänge

  • Unbenanntfff.jpg
    Unbenanntfff.jpg
    12,3 KB · Aufrufe: 38

heybiy

Grünschnabel
hallo..
ich lese mir ein tutorial durch..:) hab oder konnte noch nichts ändern...
verstehe nicht warum es soviele einträge in der tabelle gibt..
eigentlich sollte nur die erste spalte mit den werten in der Textdatei gefüllt werden..:(