我的应用程序中有可调整大小JTable
,有些只调整cols,只调整行或两者。为此,我修改了TableModel
并在其上执行了structureDataChanged()
方法。
问题是我的列不能保留它们的宽度并且总是更宽。
添加Component
侦听器并侦听更改:
this.getTableHeader().addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
super.componentResized(e);
displayColumnWidths(getTableHeader());
}
private void displayColumnWidths(JTableHeader header) {
TableColumnModel model = header.getColumnModel();
for (int i = 0; i < model.getColumnCount(); i++) {
TableColumn column = model.getColumn(i);
column.setMaxWidth(50);
}
}
});
覆盖doLayout()
方法:
@Override
public void run() {
final TableColumnModel columnModel = this.getColumnModel();
int width = 50;
for (int column = 0; column < this.getColumnCount(); column++) {
TableCellRenderer renderer = this.getCellRenderer(0, column);
Component comp = this.prepareRenderer(renderer, 0, column);
if(comp == null)
continue;
width = Math.max(comp.getPreferredSize().width + 1, width);
columnModel.getColumn(column).setMaxWidth(width);
}
super.doLayout();
}
当我开始失去时,我希望也尝试过。
This post似乎有价值的解决方案。但我仍然想知道为什么其他方法不起作用。
结果是相同的:列标注正在进行初始化,直到fireStructureChange()
事件。
当我调整JTable
的大小时,某些数组的随机时间尺寸很大,但它仍然是随机的,并且经常会延迟。
我使用这个类(只是一个JTable
)并使我所有可调整大小的数组继承它:
public Resizeable(AbstractTableModel m) {
super(m);
this.setRowMargin(0);
this.setShowGrid(false);
this.setBackground(ViewsPreferences.P_TABLE_BACKGROUND_COLOR);
this.setCellSelectionEnabled(true);
this.setBorder(null);
this.setIntercellSpacing(new Dimension(0,0));
this.changeSelection(0, 0, false, false);
this.getTableHeader().setBackground(ViewsPreferences.PANEL_BACKGROUND_COLOR);
this.setAutoResizeMode(AUTO_RESIZE_OFF);
this.setFillsViewportHeight(false);
}