当JFrame调整大小时,JTable列可能不会调整大小

时间:2014-04-21 16:53:58

标签: java swing resize jtable


我有一个JTable,我将AUTO_RESIZE_LAST_COLUMN应用于。当我向左或向右拖动列时,它会自动调整最后一列的大小。
但是,JTable附加到带有BorderLayout管理器的JPanel。当我调整JFrame的大小时,JPanel会调整大小,并且由于JTable填充了JPanel,因此JTable也会调整大小。但是当我调整JFrame的大小时,AUTO_RESIZE_LAST_COLUMN不起作用,而是调整所有列的大小。

当JFrame更改大小时,我希望它 auto_resize最后一列,而不是调整所有列的大小。

代码:

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);
    }
}

1 个答案:

答案 0 :(得分:4)

doLayout()的{​​{1}}方法查看API文档。

在布局开始之前,该方法获取tableHeader的resizingColumn。当由于调整封闭窗口的大小而调用该方法时,resizingColumn为null。这意味着调整大小发生在JTable的“外部”,并且无论JTable的自动调整大小模式如何,都应该将更改 - 或“delta” - 分发到所有列。

因此默认情况下不支持此行为。

覆盖JTable的doLayout()方法并将“resizing column”设置为最后一列似乎可以解决问题:

JTable