JList wird angezeigt, JTable (DefaultTableModel) nicht

MarDaiBre

Aktives Mitglied
Hallo,

undzwar möchte ich in meinem Programm übergebene Strings in eine Tabelle speichern und anzeigen lassen. Ich habe das bisher in einer JList (selbstgeschriebene Klasse) gespeichert und es wurde alles wunderbar ausgegeben. Da sich eine Tabelle nun doch besser eignet, möchte ich nun eine Tabelle verwenden.

Ich habe alles so gelassen, wie es auch bisher funktioniert, nur habe ich anstelle der JList-Klasse (GUILIste) eine zweite Klasse (GUITable) geschrieben, welche auch (zumindest sagt es die Konsolenausgabe) funktioniert. Nur wird die Tabelle nicht angezeigt, habe aber keine Ahnung, woran es liegen kann. Ein Fehler wird nicht ausgegeben. Hier mal der Code:

Java:
public GUITable guiListeRisiken = new GUITable();
JScrollPane scrollPaneRisiko = new JScrollPane(guiListeRisiken);

class GUITable extends JTable
{
    Vector<String> columnNames = new Vector();
        Vector<Vector<String>> data = new Vector();
    private DefaultTableModel tabRisiko = new DefaultTableModel(data, columnNames);
        
    public void setElements(Collection risikoList)
    {
        tabRisiko.setNumRows(0);
        
            columnNames.addElement("Risikonummer");
            columnNames.addElement("Verursachernummer");
            columnNames.addElement("Fehlerortnummer");
            columnNames.addElement("Fehlerortbezeichnung");
            columnNames.addElement("Quadrant");
            columnNames.addElement("Fehlerartnummer");
            columnNames.addElement("Fehlerartbezeichnung");
            
        Iterator it = risikoList.iterator();
        while(it.hasNext())
        {
            RisikoInfo k = (RisikoInfo)it.next();
                
            String test = k.getDaten();
            String[] seperated = test.split("\\+");
                
            Vector<String> row = new Vector(5);
                
            row.addElement(seperated[0]);
            row.addElement(seperated[1]);
            row.addElement(seperated[2]);
            row.addElement(seperated[3]);
            row.addElement(seperated[4]);
            row.addElement(seperated[5]);
            row.addElement(seperated[6]);

                        data.addElement(row);
        }
            
        revalidate();
    }

        public GUITable()
    {
        setModel (tabRisiko);
    }
}

class GUIListe extends JList
{
    private DefaultListModel swingListModelRisiko = new DefaultListModel();
        
    public void setElements(Collection risikoList)
    {
        swingListModelRisiko.removeAllElements();
        Iterator it = risikoList.iterator();
        while(it.hasNext())
        {
            RisikoInfo k = (RisikoInfo)it.next();
            swingListModelRisiko.addElement (k.getDaten());
        }
    }

        public GUIListe()
    {
        setModel (swingListModelRisiko);
    }
}

/**
* Der Konstruktor der Klasse KlausurFrame.
* 
*/
public LadeGUI (Risiko model)
{
    this.prg = model; // Model uebernehmen.
    beschriften(); // Dialogfenster-Titel beschriften
    initFromModelRisiko(); // GUI-Elemente aus model initialisieren.
    layoutElements(); // GUI-Elemente positionieren.
}

private void initFromModelRisiko()
{
    guiListeRisiken.setElements (prg.getRisiko());
}

Später wird halt das JScrollPane scrollPaneRisiko auf ein Panel ausgegeben, leider nur wenn ich public GUITable guiListeRisiken = new GUITable(); in public GUIListe guiListeRisiken = new GUIListe(); ändere. Hat da jmd ne Idee?

Ich bedanke mich schonmal im Voraus.

Viele Grüße
 
Zuletzt bearbeitet von einem Moderator:
Hi,

ich verstehe leider nicht ganz dein Problem, bzw. was es genau ist.

- werden die Daten in deiner JTable nicht angezeigt?
oder
- wird die JTable nicht in deinem Frame dargestellt - also ist sie sichtbar?

Wenn es das Zweite ist, dann fehlt noch etwas Quellcode - der in dem du die JTable erzeugst und dem Pane zuweist.

Die Zuweisung wird prinzipiell mittels

Java:
jScrollPane.setViewPoerView(new GUITable())

durchgeführt!

Gruß
 
Hallo,

danke für deine Antwort. Ich habe gerade nochmal detaillierter geschaut. Nun habe ich festgestellt, dass er in der While-Schleife den String richtig trennt und speichert. Nur die Tabelle wird nicht auf dem Frame angezeigt. Bei der JList macht er es ohne Probleme.
 
Zuletzt bearbeitet:
Nur die Tabelle wird nicht auf dem Frame angezeigt. Bei der JList macht er es ohne Probleme.

Dann solltest du uns auch entsprechenden Code bitte geben.
An deinem Code im Anfangspost ist nur ersichtlich das du eine Methode aufruft die angeblich die GUI Element positioniert. Aber ohne Code können wir nicht sagen warum sie es anscheinend doch nicht tut 🙂
 
Das stimmt 🙂 Hier einmal der Code.

Java:
class CenterPanel extends JPanel
{        
    public CenterPanel()
    {
        setLayout (new GridBagLayout());
        GridBagConstraints constraint = new GridBagConstraints();
            
        constraint.gridx = 0;
        constraint.gridy = 0;
        constraint.insets = new Insets (elementAbstand,0,0,0);
        constraint.fill = GridBagConstraints.HORIZONTAL;
        add(scrollPaneRisiko, constraint);
        scrollPaneRisiko.setPreferredSize(new Dimension(listeBreite, listeHoehe));
    }
}

private void layoutElements()
{
    setLayout(new BorderLayout()); //Layout-Manager definieren.
    add(new NorthPanel(), BorderLayout.NORTH);
    add(new CenterPanel(), BorderLayout.CENTER);
    add(new SouthPanel(), BorderLayout.SOUTH);
}

Mich wundert es nur, warum GUIListe mit einem DefaultListModel angezeigt wird, aber GUITable mit DefaultTableModel nicht. Echt zum Verzweifeln.
 
Zuletzt bearbeitet von einem Moderator:
Hey, ich habe nun eine halbfertige Lösung:
Meine Klasse GUITable sieht nun wiefolgt aus:
Java:
class GUITable extends JTable
{
    private DefaultTableModel swingTabelleModelRisiko = new DefaultTableModel();
    
    public void setElements(Collection risikoList)
    {
        swingTabelleModelRisiko.setNumRows(0);
                                
            swingTabelleModelRisiko.addColumn("Risikonummer");
            swingTabelleModelRisiko.addColumn("Verursachernummer");
            swingTabelleModelRisiko.addColumn("Fehlerortnummer");
            swingTabelleModelRisiko.addColumn("Fehlerortbezeichnung");
            swingTabelleModelRisiko.addColumn("Quadrant");
            swingTabelleModelRisiko.addColumn("Fehlerartnummer");
            swingTabelleModelRisiko.addColumn("Fehlerartbezeichnung");

        Iterator it = risikoList.iterator();
        while(it.hasNext())
        {
            RisikoInfo r = (RisikoInfo)it.next();
            String risikoSet = r.getDaten();
            String[] setSplit = risikoSet.split("\\+");
                
            Vector<String> row = new Vector(5);
            row.addElement(setSplit[0]);
            row.addElement(setSplit[1]);
            row.addElement(setSplit[2]);
            row.addElement(setSplit[3]);
            row.addElement(setSplit[4]);
            row.addElement(setSplit[5]);
            row.addElement(setSplit[6]);
                
            swingTabelleModelRisiko.addRow(row);                
        }
    
                public GUITable()
        {
            setModel(swingTabelleModelRisiko);
            addMouseListener (new ListClickHandler());
        }
}

Nun bekomme ich die Tabelle angezeigt. Bevor ich die Daten abrufe, zeigt er mir die leere Tabelle mit den Spaltenüberschriften an (Bild links). Wenn ich die Daten nun abrufe, bekomme ich zwar die korrekte Anzahl an Zeilen, aber er erweitert die Spalten bis ins Unendliche (Bild rechts). Hat jmd von euch einen Tipp? Ich probiere gerade aus, woran es liegen kann...

Anhang anzeigen 6932

}
 
Zuletzt bearbeitet von einem Moderator:
YAAAAAAAAAAAAAY.

Ich habe die Spaltenüberschriften
Java:
swingTabelleModelRisiko.addColumn("Risikonummer");
swingTabelleModelRisiko.addColumn("Verursachernummer");
swingTabelleModelRisiko.addColumn("Fehlerortnummer");
swingTabelleModelRisiko.addColumn("Fehlerortbezeichnung");
swingTabelleModelRisiko.addColumn("Quadrant");
swingTabelleModelRisiko.addColumn("Fehlerartnummer");
swingTabelleModelRisiko.addColumn("Fehlerartbezeichnung");

in eine eigene Methode gepackt, welche in
Java:
public GUITable()
{
            setModel(swingTabelleModelRisiko);
            addMouseListener (new ListClickHandler());
}

vor setModel(swingTabelleModelRisiko); aufgerufen wird. Endlich geht es. Danke nochmals!
 
Zuletzt bearbeitet von einem Moderator:
Ich würde dringend davon abraten, JTable und JLIst auf die von dir beschriebene Weise zu erweitern. Um von dir gewünschte Daten anzeigen zu lassen, kannst du einer normalen JTable/JList einfach ein passendes Datenmodell (ListModel/TableModel) verpassen.
 

Zurück
Oben