当前位置: 首页 > 面试题库 >

仅在适合视口的情况下启用JTable的自动调整大小

邓光耀
2023-03-14
问题内容

我需要在JScrollPane内用可调整大小的列创建一个JTable(当用户增加列宽-
出现水平滚动条时)。为此我有用table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);。同样,当视口足够宽以容纳整个表格时,列应拉伸以填充视口宽度。为此,我具有getScrollableTracksViewportWidth()JTable类的重写方法,如下所示:

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

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

贝娄是上述问题的简单工作示例:

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。



 类似资料:
  • 问题内容: 我有一个将动态填充的表格,我希望表格始终调整大小以适合行数。我不希望任何滚动,因为表格位于面板中,并且面板的内容需要打印。我已经试过了: 但这似乎不起作用。 问题答案: 我认为这不是最好的方法。但是正如您所坚持的,我将代码放在下面。

  • 问题内容: 如何自动缩放HTML5 元素以适合页面? 例如,我可以通过将和属性设置为100%来缩放,但是不会缩放吗? 问题答案: 我相信我已经找到了一个优雅的解决方案: JavaScript CSS 到目前为止,对我没有太大的负面性能影响。

  • 问题内容: 不知道我需要什么。我有一个包含一些内部元素的容器(JPanel)。我想知道是否有可能迫使内部元素适应容器的大小。我需要使它们完全可见,即调整其大小以适合面板的尺寸,并且不剪切内部元素的某些部分。 滚动不是一种选择。 使用Layout或其他方法可以做到吗? 编辑:重要说明:问题是我无法访问内部元素,也无法访问其属性,因此我想说需要一个能够调整子元素大小以适合其大小的Layoutmanag

  • 目前,我正在用下面的代码做一个非常简单的方法。 如果我删除代码的部分,它将图像打印为正常质量+正常大小,因为我希望它的高度限制在250,并返回类似于此图像的内容。 但它返回的内容类似于下面显示的内容。

  • 问题内容: 我正在学习CopyOnWriteArrayList类。 复制新阵列的目的是什么? 是其他线程读取数组吗? 因此,如果系统具有高并发性,并且大多数线程的操作都在读取而不是写入,那么最好使用。 问题答案: 如该链接所述: CopyOnWriteArrayList是Java 5并发API中引入的并发Collection类,以及它在Java中流行的表亲。 工具列表界面类似,并且但它的一个线程安

  • Android最近增加了根据视图大小以及最小和最大文本大小调整TextViews文本大小的支持。 https://developer.Android.com/guide/topics/ui/look-and-feel/autosizing-textView.html 不幸的是,他们不支持EditTexts,那么EditText还有其他的替代方案吗?