Столбцы JTable не изменяют размер, вероятно, когда размер JFrame

1


Я получил JTable, к которому я применил AUTO_RESIZE_LAST_COLUMN. Он автоматически изменяет размер последнего столбца, когда я перетаскиваю столбцы влево или вправо.
Однако JTable привязан к JPanel с менеджером BorderLayout. Когда я изменяю размер JFrame, размер JPanel изменяется, и, поскольку JTable заполняет JPanel, JTable также изменяется. Но когда я изменяю размер JFrame, AUTO_RESIZE_LAST_COLUMN не работает, но вместо этого он изменяет размеры всех столбцов.

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

код:

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class JTableResize extends JFrame {

    private JTable table;
    private JPanel panel;
    private JScrollPane pane;

    DefaultTableModel model = new DefaultTableModel();

    public JTableResize() {
        super("JTable - Resize Problem");

        setLayout(new BorderLayout());

        panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.setBackground(Color.red);
        add(panel, BorderLayout.CENTER);

        table = new JTable(model);
        //panel.add(table);
        model.addColumn("Resize");
        model.addColumn("Problem");
        model.addColumn("........");
        model.addColumn("This should resize");

        pane = new JScrollPane(table);
        panel.add(pane);

        //this is supposed to resize last column.. It works when you drag in the columns, but not when frame are resized
        table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
        table.getTableHeader().setReorderingAllowed(false);
        table.setShowVerticalLines(false);

        for (int i = 0; i <= 50; i++) {
            model.addRow(new Object[] {i, i, i, i});
        }
    }

    public static void main(String[] args) {
        JTableResize jtr = new JTableResize();
        jtr.setSize(500, 500);
        jtr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jtr.setVisible(true);
    }
}
  • 0
    Я не вижу ничего плохого в вашем коде .. !!! это работает абсолютно нормально.
  • 0
    @Mac Попробуйте запустить его и измените размер окна вправо (сделайте окно больше). Вы должны увидеть, что все столбцы в JTable изменяют размеры. Но я хочу, чтобы только изменить размер последнего столбца (самый правый). Поэтому, когда я делаю окно больше, только последний столбец становится больше (расширяется). Таким образом, 3 первых столбца должны изменить размер, когда окно станет больше :)
Показать ещё 2 комментария
Теги:
resize
swing
jtable

1 ответ

4
Лучший ответ

Ознакомьтесь с документацией API из doLayout() JTable.

Перед началом компоновки метод получает resizingColumn tableHeader. Когда метод вызывается в результате изменения размера закрывающего окна, значение resizeColumn равно null. Это означает, что изменение размера произошло "вне" JTable, а изменение - или "дельта" - должно быть распределено по всем столбцам независимо от этого режима автоматического изменения размера JTable.

Поэтому по умолчанию это поведение не поддерживается.

Переопределение метода doLayout() JTable и установка "столбца изменения размера" в последний столбец, похоже, делают трюк:

@Override
public void doLayout()
{
    if (tableHeader != null)
    {
        TableColumn resizingColumn = tableHeader.getResizingColumn();
        //  Viewport size changed. Increase last columns width

        if (resizingColumn == null)
        {
            TableColumnModel tcm = getColumnModel();
            int lastColumn = tcm.getColumnCount() - 1;
            tableHeader.setResizingColumn( tcm.getColumn( lastColumn ) ) ;
        }
    }

    super.doLayout();
}
  • 0
    Это работает, спасибо! :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню