java - 如何获得正确的 JTable 宽度?

标签 java swing jtable

我想得到一个表格宽度。我试着用这段代码来做:

private static class ListenerForOk implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        handle();
        if (!dataIsNotInput()) {
            createDataTab();
            System.out.println(table.getWidth());
        }
    }

方法 createDataTab() 完成添加 JTable 的所有工作。因此,在 createDataTab(); 之后,我的表格位于框架上并且我可以看到它。但是这段代码 table.getWidth() 返回零。我尝试使用此代码获取表格宽度的另一种方法:

    double sum = 0.0;
    for (int i = 0; i < table.getColumnCount(); i++) {
        sum += table.getColumnModel().getColumn(i).getWidth();
    }
    System.out.println("sum: " + sum);

table.getColumnModel().getColumn(i).getWidth() 方法为所有列返回 75。这是正确的值,我有一个正确的表格宽度。但是在我的表类中,我重写了一种方法。这是我的代码:

class MyTable extends JTable {

@Override
public Component prepareRenderer(TableCellRenderer renderer, int row,
        int column) {
    Component component = super.prepareRenderer(renderer, row, column);
    int rendererWidth = component.getPreferredSize().width;
    TableColumn tableColumn = getColumnModel().getColumn(column);
    tableColumn
            .setPreferredWidth(Math.max(rendererWidth
                    + getIntercellSpacing().width,
                    tableColumn.getPreferredWidth()));

    return component;
}

因此,如果我在任何列中输入一个长字符串,该列将相应地扩展并包含其中的文本。我做到了,并且列被扩展了。但在那之后,方法 table.getColumnModel().getColumn(i).getWidth(); 再次为所有列返回 75。那么,如何获得正确的表格宽度。

最佳答案

调整列宽的基本代码是:

JTable table = new JTable( ... );
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );

for (int column = 0; column < table.getColumnCount(); column++)
{
    TableColumn tableColumn = table.getColumnModel().getColumn(column);
    int preferredWidth = tableColumn.getMinWidth();
    int maxWidth = tableColumn.getMaxWidth();

    for (int row = 0; row < table.getRowCount(); row++)
    {
        TableCellRenderer cellRenderer = table.getCellRenderer(row, column);
        Component c = table.prepareRenderer(cellRenderer, row, column);
        int width = c.getPreferredSize().width + table.getIntercellSpacing().width;
        preferredWidth = Math.max(preferredWidth, width);

        //  We've exceeded the maximum width, no need to check other rows

        if (preferredWidth >= maxWidth)
        {
            preferredWidth = maxWidth;
            break;
        }
    }

    tableColumn.setPreferredWidth( preferredWidth );
}

您还可以查看 Table Column Adjuster对于包含上述代码并添加额外功能(如数据更改时自动列调整)的类。

关于java - 如何获得正确的 JTable 宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33997328/

相关文章:

java - 带连接的 Spring JPA Costum 返回类型

java - HKDF 是否在 Java 密码体系结构中实现?

java - 应使用哪种 PostgreSQL 列类型来存储 Java BigDecimal?

java - JTable 排序器对整数和 double 排序不正确

java - 将 ResultSet 添加到 Jtable 中(两个类之间)

java - 使用 MySQL DB 中的一些数据填充 Swing 表

java - 在这种情况下我怎样才能最好地应用Hibernate-Search?

java - Swing - setResizable(true) 使 JFrame 标题栏更高,窗口尺寸更小

java - JTable 渲染器不改变背景

java - 根据列值更改 JTable 行的背景颜色