当容器大小更改时,JTable仅调整选定列的大小

时间:2013-05-03 22:13:51

标签: java swing resize jtable

对于面板内部的JTable,如果面板变大,我怎样才能将额外的空间分配给某些列(在我的情况下,到最后一列,尽管可能很好提供“第3列, 4和8将获得额外的空间。)

我想允许用户手动更改所有列的列大小。

我试过table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); 这会将额外空间分配给调整JTable大小时可调整大小的所有列。在JavaDoc for JTable中,对于doLayout(),说:

  

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

可能有办法拦截“JTable正在调整大小”事件,并做一些自定义的事情,虽然我还没弄清楚。

提出了另一种解决方案 How to exclude columns from auto-resizing in a JTable 虽然它并没有真正告诉我如何在摇摆中做到这一点。

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

覆盖doLayout()方法以拦截布局。这给出了基础知识。当最后一列宽度即将消极时,您需要确定要执行的操作。

import javax.swing.*;
import javax.swing.table.*;

public class Test2Table
{
    private static Object[][] data = new Object[][]
    {
            { "a", "b", "c" },
            { "d", "e", "f" }
    };
    private static Object[] colNames = new Object[] { "1", "2", "3" };

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run() {
                JTable table = new JTable(data, colNames)
                {
                    @Override
                    public void doLayout()
                    {
                        //  Viewport size changed. Change last column width

                        if (tableHeader != null
                        &&  tableHeader.getResizingColumn() == null)
                        {
                            TableColumnModel tcm = getColumnModel();
                            int delta = getParent().getWidth() - tcm.getTotalColumnWidth();
                            TableColumn last = tcm.getColumn(tcm.getColumnCount() - 1);
                            last.setPreferredWidth(last.getPreferredWidth() + delta);
                            last.setWidth(last.getPreferredWidth());
                        }
                        else
                        {
                            super.doLayout();
                        }
                    }

                };

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}