Java 使可调整大小的JTable';s列';抗结构变化的宽度

Java 使可调整大小的JTable';s列';抗结构变化的宽度,java,swing,jtable,jtableheader,Java,Swing,Jtable,Jtableheader,在我的应用程序中,我有可调整大小的JTable,有些只调整COL、row或两者。为此,我修改了TableModel,并对其执行structureDataChanged()方法 问题是我的列没有保持它们的宽度,而且总是变宽 已测试: 添加组件侦听器和侦听更改: this.getTableHeader().addComponentListener(new ComponentAdapter() { @Override public void componentResized(Comp

在我的应用程序中,我有可调整大小的
JTable
,有些只调整COL、row或两者。为此,我修改了
TableModel
,并对其执行
structureDataChanged()
方法

问题是我的列没有保持它们的宽度,而且总是变宽

已测试:
  • 添加
    组件
    侦听器和侦听更改:

    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);
            }
        }
    });
    
  • 随着我开始失去希望,我也尝试了这两种方法

  • 梅似乎有很有价值的解决办法。但是我仍然想知道为什么其他方法不起作用

结果 结果是一样的:列尺寸标注正在进行初始化,直到发生
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);
}

structureChanged
可能不是最合适的事件,因为这会导致表在假设旧的
TableColumnModel
不再有效的情况下重新生成它的
TableColumnModel
。你有什么建议<代码>fireDataChanged()没有任何效果。如果它重新绘制了所有的
JTable
,为什么第一个方法不起作用?(这是我的第一个问题。)
你有什么建议?fireDataChanged()没有任何效果。
-这是我的建议,但我们不知道您实际上是如何更改TableModel中的数据的。为什么要使用自定义表格模型?DefaultTableModel有什么问题。如果您需要更多帮助,请发布一篇演示问题的文章。
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);
}