【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作为构造函数参数穿进去。。。