Почему AUTO_RESIZE_LAST_COLUMN действует как AUTO_RESIZE_ALL_COLUMNS? - PullRequest
3 голосов
/ 08 ноября 2019

Когда я вызываю setAutoResizeMode с AUTO_RESIZE_OFF и AUTO_RESIZE_ALL_COLUMNS, тогда я получаю ожидаемые результаты, описанные здесь , когда я изменяю размер окна.

Когда я вызываю его с 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 ]

1 голос
/ 08 ноября 2019

Кажется, что режим автоматического изменения размера JTable применяется только тогда, когда один столбец изменил свой собственный размер, а не всю таблицу. Согласно JTable.doLayout() javadoc:

Если resizingColumn не null, это один из столбцов в таблице, который изменил размер, а не таблицусам. В этом случае режимы автоматического изменения размера определяют способ распределения дополнительного (или дефицитного) пространства среди доступных столбцов.

Такое поведение можно увидеть, установив столбец вручную с помощью JTableHeader.setResizingColumn() со следующим кодом, он автоматически изменит размер последнего столбца:

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

Не уверен, является ли это ошибкой или предполагаемым поведением. Это может быть ошибка JDK-4098154 . Подсказка, что это ошибка, обнаружена в setResizingColumn javadoc :

Код приложения не будет использовать этот метод явно, он используется внутри механизма определения размера столбцов.

Они могли бы так же легко (и точно) написать это:

Если единственный способ сделать ваш код - это использоватьзатем метод наш код содержит ошибку.

1 голос
/ 08 ноября 2019

Сделайте количество столбцов 5 (чтобы сделать поведение более очевидным), а затем измените размер кадра.

В обоих случаях размер столбцов будет одинаково изменен.

Затем попробуйте изменить размер отдельного человека. колонка.

В этом случае вы увидите различное поведение при использовании AUTO_RESIZE_LAST_COLUMN и AUTO_RESIZE_ALL_COLUMNS.

Я думаю, ответ на ваш вопрос заключается в том, что режим изменения размера применим только кизменение размеров отдельных столбцов, а не всей таблицы.

...