Tabelle erzuegen mit TableModel

Ja, eigentlich weiß ich ja was eine Vererbung kann. Z.b. die Klasse MainFrame erbt von der Klasse JFrame, d.h. MainFrame kann alle Methoden von JFrame benützen bzw. MainFrame ist ein JFrame?

Wie hängt das jetzt mit diesem ATM zusammen? Warum muss ich da diese Methoden in MyTableModel trotzdem rausschreiben?
 
Zuletzt bearbeitet:
Naja, ich verstehe noch nicht so wirklich, wie nun so ein TableModel genau funktioniert. Schauen wir uns doch mal bei meinem Post #1, das 2te Programm an. Hier wird ja dieses ATM verwendet.

ATM ist also eine Klasse, von der man ableiten kann. Diese Klasse enthält schon vorgegebene, aber abstrakte Methoden. Abstrakte Methoden sind einfach vorgegeben Methoden ohne Parameter etc., also einfach leer.
Und darum muss ich eine eigene Klasse machen und die Methoden von ATM erben. Und diese Methoden kann ich dann wie ich will verändert, also x parameter hinzufügen z.B.

Stimmt das?

Aber ich könnte ja theretisch einfach so eine Klasse erstellen(ohne diese von ATM abzuleiten) und einfach methoden machen. Naja gut das bringt dann wieder nix, da die Methoden, dann net mit meinem JTable verbunden sind.

Hab ich recht?

Hm naja vielleicht kann mir jemand bitte das noch etwas genauer erklären, wie das nun genau funktioniert. Wie funktioniert der Vorgang z.b. mit den Daten in die Tabelle einfügen?

Z.b. beim getValueAT, woher nimmt er jetzt nun die Daten? getValueAt heißt ja er soll die Daten von zeile 3 und spalte 4 z.b. holen, aber von wo soll er die holen, wenn noch keine Tabelle da ist?
Vielleicht erübrigt sich die Frage, wenn ich die Fragen oben beantwortet werden.


Ein 3tes Beispiel:

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= 6;
  private JTable myTable;
  public String[][] data = new String[MAX_ROWS][MAX_COLS];
	
  public MainFrame() {
    try {
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      FrameInit();
    }
    catch (Exception exception) {
      exception.printStackTrace();
    }
    
    
    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);
    }
    myTable= new JTable (new MyTableModel(MAX_ROWS, MAX_COLS, data));
    JScrollPane scrollpane = new JScrollPane(myTable);
    contentPane.add(scrollpane);
  }

  /**
   * Component initialization.
   *
   * @throws java.lang.Exception
   */
  
  
  private void FrameInit() throws Exception {
    contentPane = (JPanel) getContentPane();
    contentPane.setLayout(new BorderLayout());
    setSize(new Dimension(400, 300));
    setTitle("Frame Title");

  }
}

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 String[][] data = new String[row_cnt][col_cnt];
	String data1 [][];

	public MyTableModel(int rows, int cols, String data[] []) {
		row_cnt = rows;
		col_cnt = cols;
		data1 = data;
	}

	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 data1[row][col];
	}

}

Der Einzige Unterschied vom dem hier zum 2ten Beispiel in Post #1 ist, dass bei getValueAt ein Array verwendet wird, dass im MainFrame erzeugt wird.

Aber was macht das für einen Unterschied? Ausgabe ist ja gleich. Aber die Rechnung in Bsp2 bei getValueAt ist mir noch nicht ganz klar.
 
Da ich gerade etwas beschäftigt, habe ich deinen Text nicht ganz gelesen.
Was ich rausgelesen habe ist, dass du nicht weißt, wie die JTable mit dem TableModel zusammenarbeitet.

Das ist eigentlich recht einfach.

Man muss der Tabelle ein TableModel geben. (setModel oder Konstruktur)
Tut man dies nicht nutzt die Tabelle ein Objekt der Klasse DefaultTableModel.

Die Tabelle selbst hat keine Ahnung, wieviele Spalten oder Zeilen sie anzeigen soll, sie weiß auch nicht was in den Zellen drin steht. Da fragt sie das TableModel.
Beispielsweise, wenn die Tabelle gezeichnet werden soll (also dargestellt wird), fragt sie das TableModel nach der Spalten- und Zeilenzahl (getRowCount, getColumnCount). Da sie jetzt weiß wie groß sie sein soll fragt sie das TableModel nach den Inhalten (getValueAt). Jedes mal, wenn sie das Ergebnis für eine Zelle hat, geht sie damit zum TableCellRenderer und gibt ihm die Daten und verlangt von ihm ein grafisches Objekt (meist JLabel). Damit hat die Tabelle ein grafisches Objekt für die jeweilige Zelle, welches sie nur noch an der richtigen Stelle zeichnet.

Wenn du jetzt selbst ein TableModel schreiben möchtest, musst du mindestens das Interface implementieren. Da viele Methoden da meistens gleich implementiert werden, wurde eine Klasse geschrieben, die das Interface schon implementiert und einige Methoden schon ausprogrammiert hat. Das wäre das AbstractTableModel.
Hier sind nur noch nie Methoden zu implementieren, die meistens selbst implementiert werden. Natürlich kann man die anderen Methoden überschreiben. Mehr Parameter geben, funktioniert aber nicht, wie du es oben angedeutet hast.

Ich hoffe es ist jetzt etwas klarer geworden.

Viele Grüße

Sascha
 
Zurück