JTable bygger på en table-model, som automatisk er der, hvis du ikke selv laver én, hvilket i længden er det bedste. Nåh, men en table-model bygger på et Object[][], hvis data bliver vist i tabellen. Dette vil sige, at du er nødt til at indlæse alle dine data i Object[][], før at du kan vise dem i tabellen.
Herunder vil jeg vise dig et eksempel på en godt table-model som jeg selv har arbejdet mig frem til over længere tid. Her er desuden et link til en side med masser af eksempler på ting man kan gøre med JTable og alle andre ting
http://www.esus.com/docs/GetIndexPage.jsp?uid=311import ......;
class ServerTableModel extends AbstractTableModel {
private String[] columnNames = {"Hostname", "Description", "Ping" };
private int[] columnWidth = { 200, 75, 50 };
private Object[][] data;
private ListSelectionModel rowSM;
private JTable table;
public ServerTableModel(JTable table) {
this.table = table;
setData(new Object[0][3]) // eller noget andet
initTable();
}
private void initTable() {
table.setModel(this);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
for(int i=0; i<columnWidth.length; i++) {
table.getColumnModel().getColumn(i).setPreferredWidth(columnWidth[i]);
}
table.setShowHorizontalLines(false);
addMouseListener();
addMouseListenerRightClick();
setSelectionModel();
}
private void setData(Serverlist sl) {
for(int i=0; i<såMegetDataDuHar; i++) {
data[i][0] = ...;
data[i][1] = ...;
data[i][2] = ...;
}
}
// Mouse Listener til højre-klik
private void addMouseListenerRightClick() {
table.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) { maybeShowPopup(e); }
public void mouseReleased(MouseEvent e) { maybeShowPopup(e); }
private void maybeShowPopup(MouseEvent e) {
// Dette sker når du højreklikker på en række i tabellen
}
});
}
// Selection Listener
private void setSelectionModel() {
rowSM = table.getSelectionModel();
rowSM.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) return;
ListSelectionModel lsm = (ListSelectionModel)e.getSource();
if (lsm.isSelectionEmpty()) {
// Dette sker når intet er valgt i tabellen
}
else {
// Sker når en række vælges i tabellen
}
}
});
}
public void updateUI() {
table.updateUI();
}
private void addMouseListener() {
table.getTableHeader().addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent event) {
if (event.getClickCount() < 2)
return;
int tableColumn = table.columnAtPoint(event.getPoint());
int modelColumn = table.convertColumnIndexToModel(tableColumn);
// Sker når der dobbelt-klikkes på en tableheader
}
});
}
public Object getValueAt(int row, int col) { return data[row][col]; }
//public Object getValueAt(int row, int col) { return data[rows[row].index][col]; }
public boolean isCellEditable(int row, int col) { if (col > 0) return true; else return false; } // (eksempel)
public int getRowCount() { return data.length; }
public int getColumnCount() { return columnNames.length; }
public String getColumnName(int col) { return columnNames[col]; }
public Class getColumnClass(int col) { return getValueAt(0, col).getClass(); }
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
// Hvis du vil gøre andet med de indtastede data (value)
fireTableCellUpdated(row, col);
}
}
I din frame eller dialog hvor du har tabellen laver du bare en instans af ovenstående klasse og parser tabellen med, så skal du kun ændre i denne klasse for ta ændre på tabellens adfærd.