import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
public class JTableFixedColumnExample
extends JFrame {
Object[][] data;
Object[] column;
JTable fixedTable, table;
public JTableFixedColumnExample() {
super("Beispiel fixierter Spalten");
setSize(500, 340);
data = new Object[][] { { "Fax", "Lupo", "Fix: 9:00", "", "", "", "", "","" },
{ "Lupo", "Donald", "", "Foxi: 9:00", "", "", "Fix: 8:00", "","" },
{ "---", "Eusebia", "", "", "Foxi: 10:00", "", "", "","" },
{ "Erni", "Fax", "", "", "", "", "", "","" },
{ "Bert", "---", "", "", "", "", "Fix: 12:00", "","" },
{ "Eusebia", "Erni", "", "", "", "", "Fix: 09:00 / Foxi: 12:00", "","" },
{ "---", "Knox", "", "", "", "", "", "Foxi: 08:00","" } };
column = new Object[] { "Fix", "Foxi", "Mo", "Di", "Mi", "Do", "Fr",
"So", "So" };
final int rows = data.length;
final int cols = column.length;
TableModel fixedModel = new DefaultTableModel() {
// Zwei Spalten werden aus der Datentabelle werdenfixiert
public int getColumnCount() {
return 2;
}
public int getRowCount() {
return rows;
}
public String getColumnName(int col) {
return (String) column[col];
}
// As only the first two columns are reported this can stay
// the same
public Object getValueAt(int row, int col) {
return data[row][col];
}
};
TableModel model = new DefaultTableModel() {
// This model has two less columns in the data as two are
// fixed
public int getColumnCount() {
return cols - 2;
}
public int getRowCount() {
System.out.println("Rows: "+rows);
return rows;
}
public int setHeaderValue(int col) {
System.out.println("Col-Länge: "+column[col].toString());
return column[col].toString().length();
}
public String getColumnName(int col) {
// The columns start 2 on in the data
return (String) column[col + 2];
}
public Object getValueAt(int row, int col) {
// The first two column are for the fixed table so return
// data after by adding 2
return data[row][col + 2];
}
public void setValueAt(Object obj, int row, int col) { // As above
data[row][col + 2] = obj;
}
public boolean isCellEditable(int row, int col) {
return true;
}
};
for (int i = 0; i < column.length; ++i) {
TableColumn col = new TableColumn(i, i == 1 ? 150 : 60);
col.setHeaderValue(column[i]);
//model.addColumn(col);
}
fixedTable = new JTable(fixedModel);
ListSelectionModel lsm = fixedTable.getSelectionModel();
fixedTable.getTableHeader().setResizingAllowed(false);
lsm.addListSelectionListener(new SelectionListener(true));
table = new JTable(model);
lsm = table.getSelectionModel();
lsm.addListSelectionListener(new SelectionListener(false));
fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scroll = new JScrollPane(table);
JViewport viewport = new JViewport();
viewport.setView(fixedTable);
viewport.setPreferredSize(fixedTable.getPreferredSize());
scroll.setRowHeaderView(viewport);
scroll.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable
.getTableHeader());
getContentPane().add(scroll, BorderLayout.CENTER);
getContentPane().add(new JLabel("Fix & Foxi - Besuche bei Verwandten und Freunden"), BorderLayout.NORTH);
}
class SelectionListener implements ListSelectionListener {
boolean isFixedTable = true;
public SelectionListener(boolean isFixedTable) {
this.isFixedTable = isFixedTable;
}
public void valueChanged(ListSelectionEvent e) {
if (isFixedTable) {
int fixedSelectedIndex = fixedTable.getSelectedRow();
table.setRowSelectionInterval(fixedSelectedIndex,
fixedSelectedIndex);
} else {
int selectedIndex = table.getSelectedRow();
fixedTable
.setRowSelectionInterval(selectedIndex, selectedIndex);
}
}
}
public static void main(String[] args) {
JTableFixedColumnExample frame = new JTableFixedColumnExample();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setVisible(true);
frame.setSize(500,340);
frame.setLocation(100,100);
}
}