Tabelle erzuegen mit TableModel

Googlehupf

Erfahrenes Mitglied
Hallo,

ich habe eine Frage zu JTable und MyTableModel.

Hier mal ein Programm, dass nur JTable verwendet:
Java:
public static final int MAX_ROWS = 100;
public static final int MAX_COLS = 6;

private String[][] data = new String[MAX_ROWS][MAX_COLS];
private String[] columnNames = new String[MAX_COLS];


for (int i = 0; i < MAX_ROWS; ++i) {
for (int j = 0; j < MAX_COLS; ++j)
data[i][j] = Integer.toString(i * MAX_COLS + j);
}

for (int i = 0; i < MAX_COLS; ++i) {
columnNames[i] = new String("Spalte " + (i + 1));
}
myTable = new JTable(data, columnNames);
JScrollPane scrollpane = new JScrollPane(myTable);
contentPane.add(scrollpane);

Natürlich fehlen hier jetzt die Klassen, die das Fenster etc. generieren, aber das ist hier nicht wichtig. Aufjedenfall verwendet dies nur JTable, d.h. man übergibt ein 2-dimensionales Array, das man weiß wo die Daten hingehören und dann noch ein 1-dimensionales Array für die Spaltennamen.

Kurze Frage zum 2-dimensionalen Array: Also in i und j stehen immer die selben Daten oder? Wenn man die JTable benutzt müssen ja immer in i und j die selben daten stehen? Also: i=5, j=5 --> stehen dieselben daten usw.
Stimmts?

Hier das 2te Programm, das TableModel verwendet:

MyTableModel.java:
Java:
package JTable_Demo;

import java.awt.*;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;

public class MyTableModel extends AbstractTableModel {
	int row_cnt, col_cnt;

	public MyTableModel(int rows, int cols) {
		row_cnt = rows;
		col_cnt = cols;
	}

	public int getColumnCount() {
		return col_cnt;
	}

	public int getRowCount() {
		return row_cnt;
	}

	public String getColumnName(int colnum) {
		return new String("Spalte " + (colnum + 1));
	}

	public Object getValueAt(int row, int col) {
		return Integer.toString(row * col_cnt + col);
	}

}

MainFrame.java
Java:
package JTable_Demo;

import java.awt.*;
import javax.swing.*;

public class MainFrame extends JFrame {
  private JPanel contentPane;
  public static final int MAX_ROWS= 100;
  public static final int MAX_COLS= 100;
  private JTable myTable;
  public MainFrame() {
    try {
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      FrameInit();
    }
    catch (Exception exception) {
      exception.printStackTrace();
    }
    
    myTable= new JTable (new MyTableModel(MAX_ROWS,MAX_COLS));
    JScrollPane scrollpane = new JScrollPane(myTable);
    contentPane.add(scrollpane);
  }
  
  private void FrameInit() throws Exception {
    contentPane = (JPanel) getContentPane();
    contentPane.setLayout(new BorderLayout());
    setSize(new Dimension(400, 300));
    setTitle("Frame Title");
  }
}

Hier fehlt auch wieder die Fenster-generierung, was ja egal ist.

Ich verstehe nicht was TableMode genau macht. MyTableModel ist ja eine selbstgenerierte Klasse. Aber "extends AbstractTableModel" verleiht dem ganzen erst warschl. die "spezielle" Fähigkeit, oder?

Am Ende sollte doch dieselbe Tabelle rauskommen, wie im ersten Programm, richtig? Aber tut es nicht, also fehlt irgendwas.

Z.b. die get-funktionen in MyTableModel muss ich doch auch aufrufen oder? Kann mir einer das TableModel ev. näher erklären bitte? Hab auch leider im Inet nichts nützliches gefunden.

mfg

Googlehupf
 
Zuletzt bearbeitet:
Kurze Frage zum 2-dimensionalen Array: Also in i und j stehen immer die selben Daten oder? Wenn man die JTable benutzt müssen ja immer in i und j die selben daten stehen? Also: i=5, j=5 --> stehen dieselben daten usw.
Stimmts?
Keine Ahnung, was damit gemeint ist.

Ich verstehe nicht was TableMode genau macht. MyTableModel ist ja eine selbstgenerierte Klasse. Aber "extends AbstractTableModel" verleiht dem ganzen erst warschl. die "spezielle" Fähigkeit, oder?
Die "Spezielle Fähigkeit" nennt sich Vererbung.
Es gibt ein Standard-Tablemodel (eben das AbstractTM);
die Methoden davon machen nicht viel sinnvolles bzw. teilweise auch gar nichts.
Der Sinn der Klasse ist: Sie hat die Methoden immerhin,als Vorlage
zB. getColumnCount, keine Parameter, Returnwert int.

Vom ATM kann man jetzt selbst eine Klasse ableiten,
die die Dummymethoden von ATM durch Methoden mit sinnvollem Inhalt ersetzt.

(bzw., da ATM abstract ist hat es Methoden, die überhaupt keinen Code haben.
Nicht mal ein leeres {}. Daher ist man gezwungen,
diese Methoden in der eigenen Klasse selbst bereitzustellen,
wenn man eine ordentliche verwendbare Klasse haben will.
Falls man das nicht/unvolsltändig macht: Compilerfehler)

Z.b. die get-funktionen in MyTableModel muss ich doch auch aufrufen oder? Kann mir einer das TableModel ev. näher erklären bitte? Hab auch leider im Inet nichts nützliches gefunden.
Du selbst rufst davon gar nichts auf.

In der ersten Variante hast du ein ein zweidim. Array, was in der Tabelle stehen soll.
Jetzt gibt es aber Situationen wo ein Array unpraktisch bzw. sogar unmöglich wäre.
(Beispiel weiter unten).

Daher die Alternative, dass man der Table sagt: Hier ist mein Tablemodel,
und was du anzeigen sollst erfährst du, wenn du getXY aufrufst.
Die Table ist die einzige Stelle, die etwas aus dem TM braucht.
(Man kann es schon selbst verwenden, aber muss nicht).
Und wenn die Table wissen will, was in Zeile 3 Spalte 4 steht
oder wieviel Spalten es eigentlich gibt ruft sie Methoden aus deinem TM auf.
Die geben dann den Wert zurück -> Woher die den haben ist dann deine Sache.


Ein Beispiel, wann die Array-Variante überhaupt nicht geht:
Wenn zB. die anzuzeigenden Daten in einer Datei auf der Festplatte sind
und dort insgesamt 20GB haben.
Für ein Array müsste man alles zur selben Zeit im Hauptspeicher haben,
was oft durch Speichermangel einfach nicht geht.
Mit TM holt sich die Table nur das, was sie laut Position der Scrollleiste gerade braucht,
und dein TM kann dann die paar geforderten Zeilen aus der Datei holen.
 
Ich hab hier mal ein Bild. Links ist die zweite Variante und rechts die erste. Laut meiner .pdf steht da, dass die zweite variante genauso aussehn müsste wie die erste.

Ich verstehe es nicht. Ich muss doch irgendwie sagen, was jetzt da in der Tabelle steht oder?.

JTable fragt ja ATM wegen der Werte, oder? Aber wie weise ich Werte der ATM zu?
 

Anhänge

  • compare.png
    compare.png
    18,5 KB · Aufrufe: 54
Ich verstehe es nicht. Ich muss doch irgendwie sagen, was jetzt da in der Tabelle steht oder?.
JTable fragt ja ATM wegen der Werte, oder? Aber wie weise ich Werte der ATM zu?
Die JTable fragt nicht das AbstractTableModel, sondern deine davon abgeleitete Klasse
(solange du der JTable eine Instanz davon beim Erstellen auch gibst)

Und wo deine Klasse die Werte hernimmt ist, wie gesagt, ganz egal.
Deine klasse könnte in sich wieder ein Array haben, oder aus Dateien lesen,
oder die Werte je nach Bedarf on-the-fly ausrechnen, oder...

Das Soll sind also 6 Spalten, 100 Zeilen, und von links oben bis rechts unten
fortlaufende Werte beginnend bei 0. Dein TableModel willst du so machen, dass die
Zeilen-/Spaltenanzahl per Konstruktorparameter festgelegt wird, gut.

Problem in MainFrame.java:
Du hast die MAX_ROWS und MAX_COLS beide auf 100.
Die übegibst du dann auch als Zeilen-/Spaltenanzahl zum Tablemodel.
Sollte der Col-Teil nicht 6 sein?

Weil du zurzeit 100 Spalten hast ist der Platz für deine angezeigte JTable so klein,
dass die Spalten zu schmal für zwei-, drei...stellige Zahlen sind.
Deshalb ... als Platzhalter

Das Tablemodel selbst schaut auf den ersten Blick gut aus.
Also einfach die Cols runterdrehen.
 
Ah ok jetzt gehts!


Aber wie läuft das genau ab? Wenn ich die Instanz von ATM an JTable übergeben, wird ja zumal der Konstruktor von ATM aufgerufen, da werden ja jetzt Spalten- und Zeilenanzahl gespeichert.

Dann wird der Konstruktor von JTable aufgerufen und dann holt sich JTable durch diese Methoden, also ganz automatisch die ganzen Informationen, was ich in den Methoden geschrieben habe.

Hab ich das in etwa so richtig verstanden?
 
Zuletzt bearbeitet:
Ungefähr richtig.
Ja, die JTable verwendet deine Methoden aus dem Tablemodel,
um Infos über das Anzuzeigende zu sammeln.

Aber nochmal deutlicher: Du hast kein "A"-TM.
Nachhilfe in Vererbung ist wohl angesagt, unabhängig von der Tablesache hier.
...aber das hat Zeit bis morgen (äh, heute, aber später :))
 

Neue Beiträge

Zurück