JTables auf verschiedenen tab pages platzieren

electroboogie

Grünschnabel
Moin,

ich habe mal eine frage zu JTabbedPage.

In meinem Programm verwende ich JTabbedPage um auf mehreren tab pages meine Tabellen darzustellen. Das ganze sieht so ähnlich aus wie in Excel. Da kann man auch verschieden Tabellenblätter über tab pages auswählen.

Hier seht ihr die Klasse KassenbuchFrame. In dieser wird nur ein MonatTabPage-Obj.
Auf dieser werden mehrere tab pages dargestellt, die wiederum jeweils einen Monat in Tabellenform anzeigen. Ein Monat enthält die Einnahmen und Ausgaben des selbigen.
Diese Monate werden in KassenbuchData gespeichert, siehe folgenden code.
Code:
public class KassenbuchFrame extends JInternalFrame 
{
    private KassenbuchDaten kbData;  //Darin stehen die Daten(Monate). Diese werden in einer                                                               //Linked List gestored
    private MonatTabPage monatBlatt; //Dies ist ein JTabbedPage, siehe unten
      
    public KassenbuchFrame(String title, KassenbuchDaten kbData) 
    {
        super(title, true, true);
        this.kbData = kbData;
        setSize(new Dimension(383, 296));
        setResizable(true);
        setClosable(true);
        setIconifiable(true);
        setMaximizable(true);
        setVisible(true);
    }
    
    //diesem constructor wird ein KassenbuchDaten-Obj übergeben
    //jeder KassenbuchFrame, kann nur ein  KassenbuchDaten-Obj besitzen
    //in diesem kbData sind/können aber mehrere Monate enthalten sein
    public KassenbuchFrame(String title, KassenbuchDaten kbData, String month)
    {
        this(title, kbData);
        //erzeuge ein JTableMonatModel-Obj und über gebe einen/den ersten Monat
        //jede tab page zeigt einen Monat an
        JTableMonatModel model = new JTableMonatModel(kbData.getMonth(0));
        monatBlatt = new MonatTabPage();
        monatBlatt.addTab(model);
        getContentPane().add(monatBlatt);
    }
    
    //fügt einen neuen monat in das kbData ein
    //und erzeuget ein neues JTableMonatModel für diesen Monat
    //und erzeugt eine neue tab page für diesen Monat
    public void addMonthToKassenbuch(MonatDaten month)
    {
        kbData.addMonth(month);
        model = new JTableMonatModel(month);
        monatBlatt.addTab(model);
        getContentPane().add(monatBlatt);
    }
    
    public KassenbuchDaten getKassenbuch()
    {
        return kbData;
    }
    
    public MonatTabPage getTabPage()
    {
        return monatBlatt;
    }
}

Hier folget die Klasse MonatTabPage
Code:
public class MonatTabPage extends JTabbedPane
{
    
    private JScrollPane scrollpane;
    
    MonatTabPage()
    {
        super(BOTTOM);            
    }
  
    public void addTab(JTableMonatModel tableModel)
    {
        //übergebe das TableModel an die JTable
        JTable table = new JTable(tableModel);
        //erzeuge JScrollPane damit auch die Tabellen header sichtbar sind
        JScrollPane scrollpane = new JScrollPane();
        scrollpane.add(table);
        //Methode von JTabbedPane
        addTab(tableModel.getMonat().getMonat(),scrollpane);
    }   
}

Das ganze funktioniert auch. ich kann neue tab pages hinzufügen und kann auch neue Einträge in die jeweiligen Tabellen machen. Aber leider weiß ich nicht, wie ich wieder an die einzelnen Tabelleninhalte komme oder wenn ich etwas in die Tabelle eingetragen habe, das in das KassenbuchDaten-Obj. eintrage.

Wäre dankebar für jede Hilfe oder auch einfach nur Tipps, wie man es besser machen kann.

Bevor ich es vergesse. Ich benutzte die Klasse JTableRows, die Snape irgendwo hier im Forum mal geposted hat. An der Stelle vielen Dank für diese Klasse.

MfG
ekectroboogie
 
Über
monatBlatt.getComponentAt(myIndex)
kommst Du an die Componente, die Du unter dem Index myIndex der JTabbedPane hinzugefügt hast.
Den zweiten Teil Deiner Frage habe ich auch nach zweimaligem Durchlesen nicht so recht verstanden.
 
Arrgghhh.


Sorry,

leider hatte ich es etwas eilig und mein Taxi stand schon vor der Tür. Deshalb entstand da etwas, wo ich selber jetzt nicht mehr weiß, was es heißt. ;)

Aber das macht rein garnix. Ich will ja selber noch was tun.

So, nun zu deiner Antwort.
Danke erstmal für den Tipp. Leider bekomme ich das so nicht hin. Ich kann mir zwar das JSrollPane-Obj. zurück geben lassen, aber ich komme nicht an das JTable-Obj. , was in dem JScrollPane-Obj. liegt. Vielleicht kannste mir ja sagen wie das geht. Aber ich war auch nicht untätig und habe mir etwas einfallen lassen. Es ist recht simple, aber . Kannst du mir bitte sagen, ob ich das so machen kann oder ob das nicht so gut ist.


Das hier ist wieder die JTabbedPane-Klasse mit meinen zugaben.
Hier wird wieder ein JScrollPane-Obj. geadded. Aber diesmal eins von mir, siehe unten.
Code:
public class JMonatTabbedPane extends JTabbedPane
{
    
    JMonatTabbedPane(JTableScrollPane tbscrlpane, String month)
    {
        super(BOTTOM);
        addJTableScrollPane(tbscrlpane, month);
    }
   
    public void addJTableScrollPane(JTableScrollPane tbscrlpane, String month)
    {
       addTab(month, tbscrlpane);
    }   
}

So hier ist das JTableScrollPane. Es ist abgeleited aus dem JScrollPane.
Aber hier werden noch zwei Variablen(Obj) gespeichert vom Type JMonatTableModel und JTable. Diese kann man sich mit den public Methoden zurückgeben lassen. So komme ich an das table model und kann row´s adden oder lösche.
Code:
public class JTableScrollPane extends JScrollPane
{
    private JMonatTableModel model;
    private JTable table;
    
    
    public JTableScrollPane(MonatDaten month)
    {
        super();
        model = new JMonatTableModel(month);
        table = new JTable(model);
        setViewportView(table);
    }
    
    public JMonatTableModel getJTableModel()
    {
        return model;
    }
    
    public JTable getJTable()
    {
        return table;
    }
}

Hier ist mal ein Example. miCloseAbrechng ist nen Menu -Eintrag, der einen dummy Eintrag in die Tabelle macht. Es wird ein neues Eintrag-Obj. erzeugt und an die JMonatTableModel-Methode "addRow(..)" übergeben.Dabei wird es auch gleich in der Datenklasse MonatDaten abgelegt. Und siehe da, es ist in der Tabelle.
Leider gibts noch nen paar Casts zu verstecken.
Code:
if(e.getSource() == miCloseAbrechng)
{
             Eintrag entry = new Einnahme(1200.50, 0, "19.09.2001", "Hallo",12345679,100);
             ((JTableScrollPane)((JKassenbuchFrame)desktop.getSelectedFrame()).getTabMonat().getSelectedComponent()).getJTableModel().addRow(entry);
}

Nochmal thanks an Snape

MfG
electroboogie
 
Zuletzt bearbeitet:
electroboogie hat gesagt.:
Arrgghhh.

So, nun zu deiner Antwort.
Danke erstmal für den Tipp. Leider bekomme ich das so nicht hin. Ich kann mir zwar das JSrollPane-Obj. zurück geben lassen, aber ich komme nicht an das JTable-Obj. , was in dem JScrollPane-Obj. liegt. Vielleicht kannste mir ja sagen wie das geht. Aber ich war auch nicht untätig und habe mir etwas einfallen lassen. Es ist recht simple, aber . Kannst du mir bitte sagen, ob ich das so machen kann oder ob das nicht so gut ist.

Hier ist mal ein Example. miCloseAbrechng ist nen Menu -Eintrag, der einen dummy Eintrag in die Tabelle macht. Es wird ein neues Eintrag-Obj. erzeugt und an die JMonatTableModel-Methode "addRow(..)" übergeben.Dabei wird es auch gleich in der Datenklasse MonatDaten abgelegt. Und siehe da, es ist in der Tabelle.
Leider gibts noch nen paar Casts zu verstecken.
Code:
if(e.getSource() == miCloseAbrechng)
{
             Eintrag entry = new Einnahme(1200.50, 0, "19.09.2001", "Hallo",12345679,100);
             ((JTableScrollPane)((JKassenbuchFrame)desktop.getSelectedFrame()).getTabMonat().getSelectedComponent()).getJTableModel().addRow(entry);
}

Nochmal thanks an Snape

MfG
electroboogie

Diese Zeile

((JTableScrollPane)((JKassenbuchFrame)desktop.getSelectedFrame()).getTabMonat().getSelectedComponent()).getJTableModel().addRow(entry);

Sieht mir etwas verdächtig aus. Die Casts mögen stimmen, aber Du musst schon sicherstellen, dass sie alle greifen und sich kein anderes Objekt in der Aufrufkette "versteckt". Ansonsten knallt es mit einer ClassCastException.
 
Ja das mit den Casts. Aber ich werde mir ein paar Getter in die betreffenden Klassen schreiben, damit ich nicht so einen langen Ausdruck habe. Was ich aber noch wissen wollte ist, ob ich meine Klasse JTableScrollPane (abgeleitet won JScrollPane) so nutzen kann.


MfG
electroboogie
 
Zurück