Swing JTable TableModel + RowCount

dior

Bekanntes Mitglied
Hi,

ich habe ein kleines Programm welches eine OracleDB ausliest (select) und das Ergebnis in eine JTable schreibt.
Ich habe dieses TableModel:

Java:
public class FillTableTest extends AbstractTableModel{

 /**
 *
 */
 private static final long serialVersionUID = -912060609250881296L;
 private ResultSet rs;
 public int rowCount;
 private int columnCount;
 private ArrayList data=new ArrayList();
 
 public FillTableTest(ResultSet _rs) throws Exception
 {
 setRS(_rs);
 }

 public void setRS(ResultSet _rs)
 throws Exception
 {
 this.rs=_rs;
 ResultSetMetaData metaData=_rs.getMetaData();
 rowCount=0;
 columnCount=metaData.getColumnCount();
 while(_rs.next()){
 Object[] row=new Object[columnCount];
 for(int j=0;j<columnCount;j++){
 row[j]=_rs.getObject(j+1);
 }
 data.add(row);
 rowCount++;
 }
 }

 public int getColumnCount(){
 return columnCount;
 }

 public int getRowCount(){
 return rowCount;
 }

 public Object getValueAt(int rowIndex, int columnIndex){
 Object[] row=(Object[]) data.get(rowIndex);
 return row[columnIndex];
 }

 public String getColumnName(int columnIndex){
 try{
 ResultSetMetaData metaData=rs.getMetaData();
 return metaData.getColumnName(columnIndex+1);
 }catch(Exception e){
 e.printStackTrace();
 return null;
 }
 }
}


Jetzt möchte ich aber noch zusätzlich als 1. (neue) Spalte eine fortlaufende Numerierung der Zeilen haben (wie in excel z.B.).

Also müsste ich ein Tablemodell wie z.B. dieses:
Java:
class LineNumberTableModel extends DefaultTableModel 
{
  public int getColumnCount() 
  {
    return super.getColumnCount() + 1;
  }
  public Object getValueAt( int row, int col )
  {
    if( col == getColumnCount() )
    {
       return new Integer( row );
    } else 
    {
       return super.getValue( row, col );
  }
}

mit meinem kombinieren damit mir die Zeilen Nummeriert werden und ebenfalls das Ergebnis der SQL Query angezeigt wird.


Kann mir dabei bitte jemand helfen?

Danke im Voraus....
 
S

so0jvpwemm

Gast
bei col==0 musst Du einfach nur die Zeile, also row oder auch row+1 zurückgeben.
bei allen anderen musst Du den Wert aus col-1 zurückgeben.
 

HimBromBeere

Top Contributor
[JAVA=9]
if( col == getColumnCount() )[/code]
Hier musst du nicht auf die Gesamtanzahl an Spalten testen, sondern ob die aktuelle Spalte die erste (also Index 0) ist:
Java:
if( col == 0) return row
Der rest stimmt dann wieder.

Aber ich verstehe nicht ganz, wozu du zwei versch. Modelle brauchst. Hau das, was da in deiner
Code:
LineNumberTableModel
-Klasse steht in deine
Code:
FillTableTest
rein, fertig ist.
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
Und wo ist das Problem?

Java:
public class FillTableTest extends AbstractTableModel{
    private ResultSet rs;
    public int rowCount;
    private int columnCount;
    private ArrayList data=new ArrayList();
 
    public FillTableTest(ResultSet _rs) throws Exception {
        setRS(_rs);
    }
 
    public void setRS(ResultSet _rs) throws Exception {
        this.rs=_rs;
        ResultSetMetaData metaData=_rs.getMetaData();
        rowCount=0;
        columnCount=metaData.getColumnCount();
        while(_rs.next()){
            Object[] row=new Object[columnCount];
            for(int j=0;j<columnCount;j++){
                row[j]=_rs.getObject(j+1);
            }
        data.add(row);
        rowCount++;
    }
 
    public int getColumnCount(){
        return columnCount + 1;
    }
 
    public int getRowCount(){
        return rowCount;
    }
 
    public Object getValueAt(int rowIndex, int columnIndex){
        Object[] row=(Object[]) data.get(rowIndex);
        return row[columnIndex];
    }
 
    public String getColumnName(int columnIndex){
        try{
            ResultSetMetaData metaData=rs.getMetaData();
            return metaData.getColumnName(columnIndex+1);
        }catch(Exception e){
           e.printStackTrace();
           return null;
        }
    }

    public Object getValueAt( int row, int col ) {
        if( col == 0) return row;
        Object[] row=(Object[]) data.get(row);
        return row[col];
    }
 }
 
Zuletzt bearbeitet:

dior

Bekanntes Mitglied
hmmm danke für den Code aber so funktioniert das nich....

Java:
 public Object getValueAt
ist doppelt...


Ich verstehe auch nicht ganz wo genau die zusätzliche Spalte eingetragen ist?

(Sorry wenn das so Offensichtlich ist das ich das eigentlich selbst sehen sollte, aber irgendwie sehe ich den Wald vor lauter Bäumen nicht)

-> der 2. Code (LineNumberTableModel) den gibt es bei meinem Programm zur Zeit ja noch nicht... den will ich ja erst "dazu bauen"


Wenn ich es so mache:
Java:
public class FillTableTest extends AbstractTableModel{

 /**
 *
 */
 private static final long serialVersionUID = -912060609250881296L;
 private ResultSet rs;
 public int rowCount;
 private int columnCount;
 private ArrayList data=new ArrayList();
 
 public FillTableTest(ResultSet _rs) throws Exception
 {
 setRS(_rs);
 }

 public void setRS(ResultSet _rs) throws Exception {
 this.rs=_rs;
 ResultSetMetaData metaData=_rs.getMetaData();
 rowCount=0;
 columnCount=metaData.getColumnCount();
 while(_rs.next()){
 Object[] row=new Object[columnCount];
 for(int j=0;j<columnCount;j++){
 row[j]=_rs.getObject(j+1);
 }
 data.add(row);
 rowCount++;
 }
 }

 public int getColumnCount(){
 return columnCount + 1;
 }

 public int getRowCount(){
 return rowCount;
 }

 public Object getValueAt(int rowIndex, int columnIndex){
 //Object[] row=(Object[]) data.get(rowIndex);
 //return row[columnIndex];
     if( columnIndex == 0) return rowIndex;
        Object[] row=(Object[]) data.get(rowIndex);
        return row[columnIndex];

 }

 public String getColumnName(int columnIndex){
 try{
 ResultSetMetaData metaData=rs.getMetaData();
 return metaData.getColumnName(columnIndex+1);
 }catch(Exception e){
 e.printStackTrace();
 return null;
 }
 }

Dann wird mir zwar die 1. Spalte durchnummeriert (ist aber die 1. Spalte der Datenbank die überschieben wird) aber ich brauche eine eigene neue spalte am beginn...

Fehlermeldung:
java.sql.SQLException: Ungültiger Spaltenindex: getValidColumnIndex
at oracle.jdbc.driver.OracleResultSetMetaData.getValidColumnIndex(OracleResultSetMetaData.java:138)
at oracle.jdbc.driver.OracleResultSetMetaData.getColumnName(OracleResultSetMetaData.java:306)
at Stromobjekte.FillTableTest.getColumnName(FillTableTest.java:66)
at javax.swing.JTable.addColumn(JTable.java:2770)
at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1264)
at javax.swing.JTable.tableChanged(JTable.java:4374)
at javax.swing.JTable.setModel(JTable.java:3676)
at javax.swing.JTable.<init>(JTable.java:612)
at javax.swing.JTable.<init>(JTable.java:553)



EDIT: ok, ist zwar doppelt sehe aber gerade das das im Grunde das gleiche ist. Also einfach eines bzw. mein original ohne if weglassen.... oder?
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
Ups, ja tschuldigung... hab ich wohl beom Kopieren übersehen. Die richtige Methode ist die untere von beiden, also
Java:
public Object getValueAt( int row, int col ) {
    if( col == 0) return row;
    Object[] row=(Object[]) data.get(row);
    return row[col];
}
 

dior

Bekanntes Mitglied
Ja so funktioniert das super.:toll:.. aber es wird noch die 1. Spalte mit der Numerierung überschrieben.
Wie füge ich jetzt vor der (durch die sql Abfrage) generierten Tabelle eine neue Spalte ein in der diese Numerierung steht?
 

dior

Bekanntes Mitglied
Ich habe die RowNumberTable.java in mein Prog eingebau.

Wie muss ich die jetzt in meinen Aufruf einbauen? Ich bekomme immer nur ein graues Feld ohne Tabelle wenn ich das probiere...

hier ist mein Aufrufcode:

Java:
JTable table = new JTable(myModelTest());          
        TableRowFilterSupport.forTable(table).apply(); // Filterfunktion mit Rechtsklick importiert (Bibliothek) com.ezware.....
        table.setAutoCreateRowSorter(true);            // asc/desc Filterung mit linksklick
        JFrame f = new JFrame(Objekt + " - " + "Gesamtanzahl der Zeilen (ohne Filterung)= " + countRows(conn, tableName));
        //f.setSize(1500, 800);
   
        Rectangle maxBounds = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();      // Berechnet die Maximal mögliche Größe der Tabelle bzw. des Frames       
        f.setSize(maxBounds.width, maxBounds.height);                                                          // und setzt diese dann auf maximum damit der ganze Bildschirm gefüllt ist!
        f.add(new JScrollPane(table));
        table.setBackground(Color.WHITE);
        // table.setRowHeight(45);
        //Stromobjekte.AutofitTableColumns.autoResizeTable(table, true, 10, true);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

/*
JScrollPane scrollPane = new JScrollPane(table);
        JTable rowTable = new RowNumberTable(table);
        scrollPane.setRowHeaderView(rowTable);
        scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,
            rowTable.getTableHeader());
        scrollPane.add(table);
*/

f.setVisible(true);
 
S

so0jvpwemm

Gast
Und was soll der Code uns sagen?

Wenn man "vorne" eine zusätzliche Spalte zur Nummerierung einfügen will, muss die Methode im TableModel übrigens so lauten:
Java:
public Object getValueAt( int row, int col ) {
    if( col == 0)
        return row;
    Object[] row=(Object[]) data.get(row);
        return row[col-1];
}
 

dior

Bekanntes Mitglied
Die Änderung auf col-1 hat keine Veränderung gebracht... es wird immernoch die erstel Spalte mit der Nummerierung überschrieben und keine neue eingefügt.

Der letzte code war im Bezug auf den Post von André ....

Das wäre noch viel schöner als einfach eine Spalte mit Nummern hinzuzufügen.
Aber wenn ich versuche den Code einzubauen (.java Datei habe ich eingebunden..) wird entweder nur die Numerierung wie in dem Beispiel von André angezeigt oder nur meine Tabelle.

Wie kann ich beide anzeigen lassen... dafür war der Code welcher meine Tabelle aufruft.
 
S

so0jvpwemm

Gast
Wie schaut denn das aktuelle TableModel aus?

Das Beispiel von Andre nutzt den RowHeader der ScrollPane, hier wird einfach die Nummerntabelle in den RowHeader der ScrollPane gesetzt.
 

dior

Bekanntes Mitglied
Danke an Alle und vor allem André!!

Mit dem Aufruf funktioniert es!

Java:
JScrollPane sc = new JScrollPane(table);
        JTable rowTable = new RowNumberTable(table);
        f.add(sc);
        sc.setRowHeaderView(rowTable);


:toll:


D A N K E
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
W Neues TableModel und JTable wird nicht refreshed AWT, Swing, JavaFX & SWT 3
N Swing Eintrag in JTable an dessen TableModel weiterreichen AWT, Swing, JavaFX & SWT 3
K JTable +TableModel --> Anpassung der Tabellengröße (Zeilenanzahl) AWT, Swing, JavaFX & SWT 3
L Klick auf JTable -> EditorPane manipulieren, Fragen zu TableModel AWT, Swing, JavaFX & SWT 9
E JTable und tablemodel Verständnisproblem AWT, Swing, JavaFX & SWT 3
R JTable - TableModel AWT, Swing, JavaFX & SWT 6
D JTable - TableColumnModel - TableModel AWT, Swing, JavaFX & SWT 3
S JTable nimmt TableModel nicht an AWT, Swing, JavaFX & SWT 4
G JTable - TableModel aus ArrayList AWT, Swing, JavaFX & SWT 8
A JTable, eigenes TableModel und dessen Objekte AWT, Swing, JavaFX & SWT 4
G Frage zu JTable und TableModel AWT, Swing, JavaFX & SWT 4
G JTable, TableModel und CellRenderer AWT, Swing, JavaFX & SWT 3
G jTable + ScrollPane (+ TableModel) AWT, Swing, JavaFX & SWT 7
G TableModel von JTable wieder entfernen AWT, Swing, JavaFX & SWT 10
P JTable TableModel JFreeReport AWT, Swing, JavaFX & SWT 4
T anlegen einer jTable mit TableModel AWT, Swing, JavaFX & SWT 3
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben