data = new Object[][]{ {"1","11","A","","","","",""}, {"2","22","","B","","","",""}, {"3","33","","","C","","",""}, {"4","44","","","","D","",""}, {"5","55","","","","","E",""}, {"6","66","","","","","","F"}}; column = new Object[]{"fixed 1","fixed 2","a","b","c","d","e","f"};
AbstractTableModel fixedModel = new AbstractTableModel() { // We have two fixed rows so report 2 columns from data public int getColumnCount() { return 2; } public int getRowCount() { return data.length; } 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]; } };
AbstractTableModel model = new AbstractTableModel() { // This model has two less columns in the data as two are // fixed public int getColumnCount() { return column.length -2; } public int getRowCount() { return data.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; } };
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;public class FixedColumnExample extends JFrame {
Object[][] data;
Object[] column;
JTable fixedTable,table;
public FixedColumnExample() {
super( "Fixed Column Example" );
setSize( 400, 150 );
data = new Object[][]{
{"1","11","A","","","","",""},
{"2","22","","B","","","",""},
{"3","33","","","C","","",""},
{"4","44","","","","D","",""},
{"5","55","","","","","E",""},
{"6","66","","","","","","F"}};
column = new Object[]{"fixed 1","fixed 2","a","b","c","d","e","f"};
AbstractTableModel fixedModel = new AbstractTableModel() {
// We have two fixed rows so report 2 columns from data
public int getColumnCount() { return 2; }
public int getRowCount() { return data.length; }
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]; }
};
AbstractTableModel model = new AbstractTableModel() {
// This model has two less columns in the data as two are
// fixed
public int getColumnCount() { return column.length -2; }
public int getRowCount() { return data.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; }
};
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);
}
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) {
FixedColumnExample frame = new FixedColumnExample();
frame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
System.exit(0);
}
});
frame.setVisible(true);
}
}
要是想用一个JTable的话,那就要改JViewPort的刷新,要写N多代码...