制作可调整大小的JTable专栏'宽度抵抗结构变化

时间:2016-01-20 11:35:46

标签: java swing jtable jtableheader

我的应用程序中有可调整大小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);
}

0 个答案:

没有答案