为什么AUTO_RESIZE_LAST_COLUMN表现得像AUTO_RESIZE_ALL_COLUMNS?

时间:2019-11-08 17:14:00

标签: java swing jtable

当我用setAutoResizeModeAUTO_RESIZE_OFF调用AUTO_RESIZE_ALL_COLUMNS时,当我调整窗口大小时,得到的描述是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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

我猜您答案的答案是调整大小模式仅适用于单个列的大小调整,不适用于整个表的大小调整。

答案 1 :(得分: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中揭示了一个错误的线索:

  

应用程序代码将不会显式使用此方法,而是由列大小调整机制在内部使用的。

他们本来可以很容易地(准确地)写出这样的话:

  

如果使您的代码起作用的唯一方法是使用此方法,则我们的代码有一个错误。