Also zu L2 geb ich dir mal etwas Code, eigentlich nicht Sinn der ganzen Sache aber da JTable ein wirklich nerviges und komplexes Objekt ist, machen wir mal ne ausnahme.
Da ich mich selbst immer wieder über disen Schwachsinn ärgere hab ich mir einige Methoden geschrieben die ich seither immer wieder benutze.
du brauchst Variablen:
private JScrollPane scp;
private JTable tbl;
private JTableHeader header;
private TableColumn col;
private DefaultTableModel deft;
private Font f;
private String[] headerNames = { "IP", "Name", "Version" };
private int[] colBreite = { 150, 150, 300 };
eine Methode die dir dir ganze Tablle zusammenbaut: (gut wenn du sie immer wieder neu erstellen lassen möchtest)
//############### neue Tabelle erstellen ###############
public void newTable() {
if (tbl != null) {
this.remove(tbl);
tbl = null;
}
tbl = new JTable(0, 3) {
// mit dieser Zeile wird die gesamte Tabelle nicht editierbar
public boolean isCellEditable(int x, int y) {
return false;
}
};
tbl.setRowHeight(20);
tbl.setFocusable(false);
/*
* hier wird der CellRenderer gesetzt, Object.class bedeutet das der Renderer auf alle Objekttypen reagiert.
* Man könnte hier auch InetAddress.class oder Integer.class angeben, um den Renderer einzugrenzen
*/
tbl.setDefaultRenderer(Object.class, new InetAddressCellRenderer());
// einen Sorter der Tabelle hinzufügen
enableSorting(tbl);
// Spaltenbreite setzen
// setColWidth(colBreite);
// Spaltennamen setzen
setColName(tbl, headerNames);
f = new Font("MS Sans Serif", Font.BOLD + Font.ITALIC, 15);
header = tbl.getTableHeader();
header.setFont(f);
header.setBackground(Color.lightGray);
tbl.getTableHeader().setReorderingAllowed(true);
tbl.getTableHeader().setResizingAllowed(true);
scp = new JScrollPane(tbl);
scp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// scp.setBounds(20, 100, 505, 350);
scp.getViewport().setBackground(Color.WHITE);
scp.setBorder(BorderFactory.createLoweredBevelBorder());
scp.setMinimumSize(new Dimension(505, 350));
scp.setPreferredSize(new Dimension(505, 350));
c.add(scp, new GridBagConstraints(0, 2, 6, 3, 1, 150, GridBagConstraints.CENTER,
GridBagConstraints.BOTH, new Insets(15, 15, 15, 15), 10, 10));
}
Alles anzeigen
Weitere Methoden die du einfach mit passenden Parametern füttern musst:
// ############### Zeile hinzufügen ###############
public void addRow() {
deft = (DefaultTableModel) tbl.getModel();
deft.addRow(new Object[] {});
}
// ############### Header Namen hinzufügen ###############
public void setColName(JTable table, String[] colName) {
for (int i = 0; i < table.getColumnCount(); i++) {
col = table.getColumnModel().getColumn(i);
col.setHeaderValue(colName[i]);
}
}
//############### Spaltenbreite setzen ###############
public void setColWidth(int[] breite) {
for (int i = 0; i < breite.length; i++) {
tbl.getColumnModel().getColumn(i).setPreferredWidth(breite[i]);
tbl.getColumnModel().getColumn(i).setMaxWidth(breite[i]);
}
}
Alles anzeigen
Du musst dir eines zu Herzen nehmen wenn du mit JTables arbeitest ! Folgendes: Arbeite wenn möglich immer mit dem Tabllenmodell!
Es gibt sozusagen 2 Schichten oder Ebenen bei einer JTable, die die du siehst, und das Datenmodell (nicht sichtbar) darunter. Im Prinzip werden die Daten die du in eine Tabelle schreibst in beiden Schichten übereinstimmen, es gibt aber Fälle in denen das nicht unbedingt der Fall ist.
z.B wenn eine Spalte ausgeblendet ist, oder wenn du die Tabelle Alphabetisch oder Numerisch sortieren lässt.
Dann wird oft nur die sichtbare Schicht sortiert.
// in diesem Fall gibt
tbl.getValueAt(x, y);
// einanderes Ergebnis zurück als
tbl.getModel().getValueAt(x, y);
Ich hoffe das hilft dir weiter