import java.awt.Component;
import java.awt.Font;
import java.awt.Rectangle;
import java.util.Vector;import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class HiwayTest3 { JTable table = null;
private Vector rowData = null;
public static void main(String...args){
new HiwayTest3().test();
}
private void test(){
JFrame frame = new JFrame("Test");
rowData = new Vector();
Vector column = new Vector();
column.add("A");
column.add("B");
column.add("C");
table = new JTable(new MyDefaultTableModel(rowData,column));
table.setAutoCreateRowSorter(true);
this.setCellEditor(new MyDefaultTableCellEditor(new JCheckBox()));
this.setCellRenderer(new MyDefaultTableCellRenderer());
frame.setContentPane(new JScrollPane(table));
frame.setBounds(new Rectangle(10,10,600,500));
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Vector vec = new Vector();
vec.add("1");
vec.add("2");
vec.add("3");
this.rowData.add(vec);
this.table.updateUI();

}

private void setCellRenderer(MyDefaultTableCellRenderer cellRenderer){
for(int i=0;i<this.table.getColumnCount();i++){
this.table.getColumnModel().getColumn(i).setCellRenderer(cellRenderer);
}
}
private void setCellEditor(MyDefaultTableCellEditor cellEditor){
for(int i=0;i<this.table.getColumnCount();i++){
this.table.getColumnModel().getColumn(i).setCellEditor(cellEditor);
}
}

// ===========================================
// 第二列用JCheckBox顯示
private class MyDefaultTableCellRenderer extends DefaultTableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if(column==1){
JCheckBox jck = new JCheckBox();
if(value.toString().equalsIgnoreCase("true")){
jck.setSelected(true);
}else{
jck.setSelected(false);
}
return jck;
}else{
JLabel label = new JLabel();
label.setHorizontalAlignment(SwingConstants.LEFT);
label.setFont(new Font(Font.DIALOG,Font.PLAIN,12));
label.setText(value==null?"":value.toString());
return label;
}
}
}
// 第2列用JCheckBox作為編輯器
private class MyDefaultTableCellEditor extends DefaultCellEditor{
public MyDefaultTableCellEditor(JCheckBox checkBox) {
super(checkBox);
}
}
// 設置第2列可以編輯
private class MyDefaultTableModel extends DefaultTableModel{
public MyDefaultTableModel(Vector rowData, Vector columns) {
super(rowData,columns);
} @Override
public boolean isCellEditable(int row,int col){
if(col==1){
return true;
}else{
return false;
}
} }
}
首先JTable中没有数据,此时已经设置了setAutoCreateRowSorter(true), 然后再向里面插入数据的话,再点选JCheckBox的话则会报错:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid range
at javax.swing.DefaultRowSorter.rowsUpdated(DefaultRowSorter.java:879)
at javax.swing.DefaultRowSorter.rowsUpdated(DefaultRowSorter.java:898)
at javax.swing.JTable.notifySorter(JTable.java:4201)
at javax.swing.JTable.sortedTableChanged(JTable.java:4055)
at javax.swing.JTable.tableChanged(JTable.java:4332)
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
at javax.swing.JTable.setValueAt(JTable.java:2662)
at javax.swing.JTable.editingStopped(JTable.java:4661)
at javax.swing.AbstractCellEditor.fireEditingStopped(AbstractCellEditor.java:125)
at javax.swing.DefaultCellEditor$EditorDelegate.stopCellEditing(DefaultCellEditor.java:330)
at javax.swing.DefaultCellEditor.stopCellEditing(DefaultCellEditor.java:215)
at javax.swing.DefaultCellEditor$EditorDelegate.actionPerformed(DefaultCellEditor.java:347)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:291)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at javax.swing.plaf.basic.BasicTableUI$Handler.repostEvent(BasicTableUI.java:924)
at javax.swing.plaf.basic.BasicTableUI$Handler.mouseReleased(BasicTableUI.java:1138)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)
at java.awt.Component.processMouseEvent(Component.java:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)请高手帮我下,如何解决?

解决方案 »

  1.   

    蛋疼帖。。
    刚发完就解决了。
    加上这句  ((DefaultTableModel)this.table.getModel()).fireTableDataChanged();高手再帮我解决下这个问题:
    fireTableDataChanged()这个方法是DefaultTableModel中的方法,如果JTable是通过
    Vector rowData,Vector columns 或者String[][] String[] 构造的话,那么JTable.getModel()是不能强转成DefaultTableModel的,请问此时应该怎么办呢?
      

  2.   

    郁闷,发现自己老是在发DT帖,刚才试了下  table.getModel()又可以强转成DefaultTableModel,难道我以前转错了???
      

  3.   

    最后一次回复了:我自己写了JTable排序,没有用JTable的setAutoCreatSorter(true),现在想把排序的箭头显示出来,我用getTableHeader().getGraphics().draw(),自己画了个,可是一闪而过不知各位大神有什么好方法?
      

  4.   

    JTable的操作,个人认为最关键是对TableModel的操作和理解。