【问题标题】:Why does AUTO_RESIZE_LAST_COLUMN act like AUTO_RESIZE_ALL_COLUMNS?为什么 AUTO_RESIZE_LAST_COLUMN 的行为类似于 AUTO_RESIZE_ALL_COLUMNS?
【发布时间】:2019-11-08 17:14:00
【问题描述】:

当我用AUTO_RESIZE_OFFAUTO_RESIZE_ALL_COLUMNS 调用setAutoResizeMode 时,我会在调整窗口大小时得到描述here 的预期结果。

当我用AUTO_RESIZE_LAST_COLUMN 调用它时,我得到的行为与我指定AUTO_RESIZE_ALL_COLUMNS 完全相同。

为什么?

这是 MCV 示例:

import javax.swing.*;
import java.awt.*;
public class ScrollableJTable extends JPanel {
    public ScrollableJTable() {
        setLayout(new BorderLayout());
        JTable table = new JTable(10, 10);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); // vary the constant
        JScrollPane pane = new JScrollPane(table);
        add(pane, BorderLayout.CENTER);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel panel = new ScrollableJTable();
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.setContentPane(panel);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

$ javac -version
javac 1.8.0_221

$ java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

# compile && go
$ javac ScrollableJTable.java && java ScrollableJTable

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    似乎JTable 自动调整大小模式仅适用于单个列更改其自身大小而不是整个表的情况。根据JTable.doLayout()javadoc:

    如果resizingColumn 不是null,则它是表中更改大小的列之一,而不是表本身。在这种情况下,自动调整大小模式控制额外(或不足)空间在可用列之间的分配方式。

    您可以通过使用以下代码使用JTableHeader.setResizingColumn() 手动设置列来查看此行为,它将自动调整最后一列的大小:

    JTableHeader header = table.getTableHeader();
    TableColumn lastColumn = header.getColumnModel().getColumn(9);
    header.setResizingColumn(lastColumn);
    

    不确定这是错误还是预期行为。可能是bug JDK-4098154setResizingColumn javadoc 中揭示了这是一个错误的线索:

    应用程序代码不会显式使用此方法,它由列大小机制在内部使用。

    他们本可以轻松(且准确地)写出这样的:

    如果让您的代码工作的唯一方法是使用此方法,那么我们的代码存在错误。

    【讨论】:

    • 你是对的,IMO,在这两种情况下。它必须是一个错误。它应该能够检测到列模型中的最后一列并按我说的做。但是既然这没什么大不了的,那么我不会记录错误。我会照你说的做。干得好!
    【解决方案2】:

    将列数设为 5(以使行为更明显),然后将框架调整为更大。

    在这两种情况下,列的大小都会相等。

    接下来尝试调整单个列的大小。

    在这种情况下,您将看到使用 AUTO_RESIZE_LAST_COLUMNAUTO_RESIZE_ALL_COLUMNS 时的不同行为。

    我猜你的问题的答案是调整大小模式仅适用于单个列的大小调整,而不适用于整个表格的大小调整。

    【讨论】:

    • 当我将代码改回使用AUTO_RESIZE_LAST_COLUMN 并将(10, 10) 修改为(5, 5) 时,我看不到调整大小行为有任何变化。你?此外,文档指的是调整表格大小,我认为它在JScrollPane 的控制之下。我不明白为什么JTable 应该关心谁在告诉它调整自己的大小。正确的?顺便说一句,谢谢你跳上这个。我很欣赏你的工作。
    • @JeffHolt,您在问题中包含了指向doLayout() 方法的链接。我认为我不需要再次包含/引用该链接。我试图简化 API 解释以指出“调整大小模式”仅适用于调整单个列的大小。
    • 当我问我的问题时,我没有完全理解“调整大小”列的概念,也没有理解默认列模型没有做它应该做的事情。我相信你的回答很有价值,你得到了我的投票。
    猜你喜欢
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2017-05-28
    • 2013-09-18
    • 1970-01-01
    相关资源
    最近更新 更多