代码:
package exercise;
import java.awt.BorderLayout;
import java.util.Vector;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
public class MifxedCoumntable extends JPanel {
private Vector<String> coumnNameV;
private Vector<Vector<Object>> tableValueV;
private int fixedColumn=1;
private JTable fixedCoumnTable;
private JTable floatingCoumnTable;
private class FixedColumnTableModel extends AbstractTableModel{
public String getColumnCount(int c){
return coumnNameV.get(c);
}
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return fixedColumn;
}
@Override
public int getRowCount() {
// TODO Auto-generated method stub
return tableValueV.size();
}
@Override
public Object getValueAt(int arg0, int arg1) {
// TODO Auto-generated method stub
return tableValueV.get(arg0).get(arg1);
}
}
private FixedColumnTableModel fixedcolumnTableModel;
private class FloatingColumnTableModel extends AbstractTableModel{
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return coumnNameV.size()-fixedColumn;
}
@Override
public int getRowCount() {
// TODO Auto-generated method stub
return tableValueV.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
return tableValueV.get(rowIndex).get(columnIndex+fixedColumn);
}
public String getColumnName(int c){
return coumnNameV.get(c+fixedColumn);
}
}
private FloatingColumnTableModel floatingColumnTableModel;
private class MlistSelectionListener implements ListSelectionListener{
boolean isFixedColumnTable=true;
public MlistSelectionListener(boolean is) {
// TODO Auto-generated constructor stub
this.isFixedColumnTable=is;
}
@Override
public void valueChanged(ListSelectionEvent e) {
// TODO Auto-generated method stub
if(isFixedColumnTable){
int row=fixedCoumnTable.getSelectedRow();
fixedCoumnTable.setRowSelectionInterval(row,row);
}else{
int row=floatingCoumnTable.getSelectedRow();
fixedCoumnTable.setRowSelectionInterval(row, row);
}
}
}
public MifxedCoumntable(Vector<String> co,Vector<Vector<Object>>ta,int fixedColumn){
setLayout(new BorderLayout());
this.coumnNameV=co;
this.tableValueV=ta;
this.fixedColumn=fixedColumn;
fixedcolumnTableModel=new FixedColumnTableModel();
fixedCoumnTable=new JTable(fixedcolumnTableModel);
ListSelectionModel fixed =fixedCoumnTable.getSelectionModel();
fixed.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fixed.addListSelectionListener(new MlistSelectionListener(true));
floatingColumnTableModel=new FloatingColumnTableModel();
floatingCoumnTable=new JTable(floatingColumnTableModel);
floatingCoumnTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
ListSelectionModel floating =floatingCoumnTable.getSelectionModel();
floating.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
MlistSelectionListener listern=new MlistSelectionListener(false);
floating.addListSelectionListener(listern);
JScrollPane scrollPane=new JScrollPane();
scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedCoumnTable.getTableHeader());
JViewport viewport=new JViewport();
viewport.setView(fixedCoumnTable);
viewport.setPreferredSize(fixedCoumnTable.getPreferredSize());
scrollPane.setRowHeaderView(viewport);
scrollPane.setViewportView(floatingCoumnTable);
add(scrollPane,BorderLayout.CENTER);
}
}
package exercise;
import java.awt.BorderLayout;
import java.util.Vector;
import javax.swing.JFrame;
/**
* Provide a fixed column in a table
*
* @author Gaowen
*
*/
public class JTable4 extends JFrame {
/**
*
*/
public JTable4() {
super();
setTitle("提供行标题栏的表格");
setBounds(100, 100, 500, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Vector<String> columnNameV = new Vector<String>();
columnNameV.add("日期");
for (int i = 1; i < 21; i++) {
columnNameV.add("商品" + i);
}
Vector<Vector<Object>> tableValueV = new Vector<Vector<Object>>();
for (int row = 1; row < 31; row++) {
Vector<Object> rowV = new Vector<Object>();
rowV.add(row);
for (int col = 0; col < 20; col++) {
rowV.add((int) (Math.random() * 1000));
}
tableValueV.add(rowV);
}
final MifxedCoumntable panel = new MifxedCoumntable(columnNameV,
tableValueV, 1);
getContentPane().add(panel, BorderLayout.CENTER);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
JTable4 frame = new JTable4();
frame.setVisible(true);
}
}
运行结果: