报错原因:
请看73行备注
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 21 at java.util.Vector.get(Unknown Source) at e21_07.MfixedColumnTable$FloatingColumnTableModel.getColumnName(MfixedColumnTable.java:86) at javax.swing.JTable.addColumn(Unknown Source) at javax.swing.JTable.createDefaultColumnsFromModel(Unknown Source) at javax.swing.JTable.tableChanged(Unknown Source) at javax.swing.JTable.setModel(Unknown Source) at javax.swing.JTable.(Unknown Source) at javax.swing.JTable.(Unknown Source) at e21_07.MfixedColumnTable.(MfixedColumnTable.java:34) at e21_07.ExampleFrame_07.(ExampleFrame_07.java:39) at e21_07.ExampleFrame_07.main(ExampleFrame_07.java:13)
package e21_07;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class MfixedColumnTable extends JPanel {
private static final long serialVersionUID=1L;
private JTable fixedColumnTable;
private FixedColumnTableModel fixedColumnTableModel;
private JTable floatingColumnTable;
private FloatingColumnTableModel floatingColumnTableModel;
private Vector columnNameV;
private Vector tableValueV;
private int fixedColumn=1;
public MfixedColumnTable(Vector columnNameV,
VectortableValueV,int fixedColumn){
super();
setLayout(new BorderLayout());
this.columnNameV=columnNameV;
this.tableValueV=tableValueV;
this.fixedColumn=fixedColumn;
fixedColumnTableModel=new FixedColumnTableModel();
fixedColumnTable=new JTable(fixedColumnTableModel);
ListSelectionModel fixed=fixedColumnTable.getSelectionModel();
fixed.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fixed.addListSelectionListener(new MListSelectionListener(true));
floatingColumnTableModel=new FloatingColumnTableModel();
floatingColumnTable=new JTable(floatingColumnTableModel);
floatingColumnTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
ListSelectionModel floating=floatingColumnTable
.getSelectionModel();
floating.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
MListSelectionListener listener=new MListSelectionListener(false);
//
floating.addListSelectionListener(listener); //don't miss this sentence
JScrollPane scrollPane=new JScrollPane();
scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedColumnTable.getTableHeader());
JViewport viewport=new JViewport();
viewport.setView(fixedColumnTable);
viewport.setPreferredSize(fixedColumnTable.getPreferredSize());
scrollPane.setRowHeaderView(viewport);
scrollPane.setViewportView(floatingColumnTable);
add(scrollPane,BorderLayout.CENTER);
}
private class FixedColumnTableModel extends AbstractTableModel{
private static final long serialVersionUID=1L;
public int getColumnCount(){
return fixedColumn;
}
public int getRowCount(){
return tableValueV.size();
}
public Object getValueAt(int rowIndex,int columnIndex){
return tableValueV.get(rowIndex).get(columnIndex);
}
// missed
@Override
public String getColumnName(int columnIndex) {// 返回指定列的名称
return columnNameV.get(columnIndex);
}
}
private class FloatingColumnTableModel extends AbstractTableModel{
private static final long serialVersionUID=1L;
public int getColumnCount(){
return columnNameV.size(); //错误的一行,需要改成下面一行
//return columnNameV.size() - fixedColumn;
/*
* java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 21
at java.util.Vector.get(Unknown Source)
at e21_07.MfixedColumnTable$FloatingColumnTableModel.getColumnName(MfixedColumnTable.java:86)
at javax.swing.JTable.addColumn(Unknown Source)
at javax.swing.JTable.createDefaultColumnsFromModel(Unknown Source)
at javax.swing.JTable.tableChanged(Unknown Source)
at javax.swing.JTable.setModel(Unknown Source)
at javax.swing.JTable.(Unknown Source)
at javax.swing.JTable.(Unknown Source)
at e21_07.MfixedColumnTable.(MfixedColumnTable.java:34)
at e21_07.ExampleFrame_07.(ExampleFrame_07.java:39)
at e21_07.ExampleFrame_07.main(ExampleFrame_07.java:13)
* */
}
public int getRowCount(){
return tableValueV.size();
}
public Object getValueAt(int rowIndex,int columnIndex){
return tableValueV.get(rowIndex)
.get(columnIndex+fixedColumn);
}
@Override
public String getColumnName(int columnIndex){
return columnNameV.get(columnIndex+fixedColumn);
}
}
private class MListSelectionListener implements ListSelectionListener{
boolean isFixedColumnTable=true;
public MListSelectionListener(boolean isFixedColumnTable){
this.isFixedColumnTable=isFixedColumnTable;
}
public void valueChanged(ListSelectionEvent e){
if(isFixedColumnTable){
int row=fixedColumnTable.getSelectedRow();
floatingColumnTable.setRowSelectionInterval(row, row);
}else{
int row=floatingColumnTable.getSelectedRow();
fixedColumnTable.setRowSelectionInterval(row, row);
}
}
}
}