【acuibc】基本解决JTable/JXTable序号列问题RowHeaderTable
先上代码(本代码源于CSDN,略作修改,地址https://download.csdn.net/download/wcs1989/5615037)
package com.acuilab.bc.main.ui;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.SwingUtilities;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import org.jdesktop.swingx.JXTable;
/**
* 带有显示行号功能的JTable 支持设置行高,添加行,删除行等动态事件
* 
* @author Administrator
* 
*/
public class RowHeaderTable extends JXTable {
private static final long serialVersionUID = 1L;
private int rowHeaderWidth = 40;
private final RowHeader rowHeader = new RowHeader();
private boolean rowHeaderAutoShow = false;
/*
 * 添加行表头到滚动面板里
 * @see javax.swing.JTable#configureEnclosingScrollPane()
 */
@Override
protected void configureEnclosingScrollPane() {
    super.configureEnclosingScrollPane();
    Container parent = SwingUtilities.getUnwrappedParent(this);
    if (parent instanceof JViewport) {
        JViewport port = (JViewport) parent;
        Container gp = port.getParent();
        if (gp instanceof JScrollPane) {
            JScrollPane scrollPane = (JScrollPane) gp;
            scrollPane.setRowHeaderView(rowHeader);
            rowHeaderAutoShow = true;
        }
    }
}
@Override
public void setRowHeight(int rowHeight) {
    // TODO Auto-generated method stub
    super.setRowHeight(rowHeight);
    if (rowHeader != null) {
        rowHeader.setRowHeight(rowHeight);
    }
}
@Override
public void setRowHeight(int row, int rowHeight) {
    // TODO Auto-generated method stub
    super.setRowHeight(row, rowHeight);
    rowHeader.setRowHeight(row, rowHeight);
}
@Override
public void tableChanged(TableModelEvent e) {
    // TODO Auto-generated method stub
    super.tableChanged(e);
    if (rowHeaderAutoShow) {
        rowHeader.updateAndrepaint();
    }
}
public void setRowHeaderWidth(int width) {
    this.rowHeaderWidth = width;
    rowHeader.updateAndrepaint();
}
class RowHeader extends JTable {
    private static final long serialVersionUID = 1L;
    private RowHeader() {
        super(new RowHeaderTableModel());
        this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        this.getColumnModel().getColumn(0).setPreferredWidth(rowHeaderWidth);
        this.setPreferredScrollableViewportSize(new Dimension(rowHeaderWidth, 0));
        this.setRowHeight(RowHeaderTable.this.getRowHeight());
        setBackground(getTableHeader().getBackground());
        setAutoCreateColumnsFromModel(false);
        //统一选择行
        this.setSelectionModel(RowHeaderTable.this.getSelectionModel());
    }
    public void updateAndrepaint() {
        revalidate();
        repaint();
    }
}
class RowHeaderTableModel extends AbstractTableModel {
    private static final long serialVersionUID = 1L;
    @Override
    public int getRowCount() {
        return RowHeaderTable.this.getRowCount();
    }
    @Override
    public int getColumnCount() {
        return 1;
    }
    @Override
    public Object getValueAt(int row, int column) {
        return row + 1;
    }
}
}
使用中发现,初始化以后再调用setRowHeaderWidth不起作用,只能通过直接修改私有变量
private int rowHeaderWidth = 40;
的值来调整宽度,这样带来的一个问题就是所有的RowHeaderTable序号列都是同样的长度且目前无法调整。好在acuibc目前只有一种表格,算是够用了。代码看上去似乎确实有些问题!
后续看看能不能找到其他方案!!
或者可以考虑将rowHeaderWidth作为构造函数参数穿进去。。。