启用自动调整JTable的大小,如果它适合viewport



我需要在JScrollPane中创建一个JTable,其中包含可调整大小的列(当用户增加列宽度时-水平滚动条出现)。这里我用table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);。此外,当视口宽度足以包含整个表时,列应该拉伸以填充视口宽度。为了实现这一点,我重写了JTable类的getScrollableTracksViewportWidth()方法,如下所示:

@Override
public boolean getScrollableTracksViewportWidth() {
    return getPreferredSize().width < getParent().getWidth();
}

这个方法工作得很好,除了一件事:当我第一次尝试调整列的大小时,它返回自己的宽度到开始位置。如果我快速调整列的大小并释放鼠标表继续工作就好了。那么,这种行为的原因是什么呢?为什么表尝试调整大小,即使getScrollableTracksViewportWidth()返回假?或者,您可以为实现这种调整大小模式提出更好的解决方案?

下面是上述问题的一个简单的工作示例:

import javax.swing.*;
public class TestTable {
    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 boolean getScrollableTracksViewportWidth() {
                        return getPreferredSize().width < getParent().getWidth();
                    }
                };
                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

当你试图在水平滚动条不可见时增加列的大小时,似乎默认的doLayout()逻辑不起作用,所以我摆脱了默认的逻辑,只是接受了列的宽度而不试图调整它。

import javax.swing.*;
import javax.swing.table.*;
public class TestTable {
    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 boolean getScrollableTracksViewportWidth()
                    {
                        return getPreferredSize().width < getParent().getWidth();
                    }
                    @Override
                    public void doLayout()
                    {
                        TableColumn resizingColumn = null;
                        if (tableHeader != null)
                            resizingColumn = tableHeader.getResizingColumn();
                        //  Viewport size changed. May need to increase columns widths
                        if (resizingColumn == null)
                        {
                            setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
                            super.doLayout();
                        }
                        //  Specific column resized. Reset preferred widths
                        else
                        {
                            TableColumnModel tcm = getColumnModel();
                            for (int i = 0; i < tcm.getColumnCount(); i++)
                            {
                                TableColumn tc = tcm.getColumn(i);
                                tc.setPreferredWidth( tc.getWidth() );
                            }
                            // Columns don't fill the viewport, invoke default layout
                            if (tcm.getTotalColumnWidth() < getParent().getWidth())
                                setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
                                super.doLayout();
                        }
                        setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                    }
                };
                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

编辑为AUTO_RESIZE_ALL_COLUMNS.

相关内容

  • 没有找到相关文章

最新更新