【问题标题】:Make JTable rows fill the entire height of JScrollPane使 JTable 行填满 JScrollPane 的整个高度
【发布时间】:2015-03-20 20:03:31
【问题描述】:

我在 JPanel 内的 JScrollPane 内有一个 JTable。我想让 JTable 的行填满 JPanel 的整个高度。就像,如果我有 10 行,它们会在高度方向伸展并填充整个 JPanel,如果我再添加 10 行,则行应该调整大小,以便我可以在 JPanel 中容纳所有 20 行。

我设法让 JScrollPane 填满了面板的整个高度,但表格单元格保持固定大小。有没有办法做到这一点?我想有可能在调整窗口大小时触发一个事件,然后使用窗口高度和行数设置行高,但这听起来需要做很多工作,所以如果有更简单的方法可以做到这一点很开心:)

【问题讨论】:

  • 为什么会有 JScrollPane?滚动的要点是您可以看到表格的所有行,即使它们并不都适合滚动查看窗口。如果行数较少,则底部会有空白空间。
  • 这并不是 JTable 真正应该如何工作的
  • 抱歉,只是一个简单的猜测:尝试覆盖 docs.oracle.com/javase/8/docs/api/javax/swing/… 以在您的 JTable 中返回 true(我明天将对此进行测试,如果可行,将作为答案发布)

标签: java jtable jpanel jscrollpane


【解决方案1】:

事实上,我对 cme​​ts(或类似 JTable#setFillsViewportHeight 的东西)的初步猜测在这里没有帮助:它们只影响表格本身的高度,而不影响表格的高度单元格

此外,单元格高度的处理有点棘手,考虑到自己的单元格渲染器、行边距或您可以手动修改单个行的高度,可能存在许多极端情况(这会在内部导致构建管理这些行高的专用模型)。

对于最简单的情况,ComponentListener 可以根据封闭滚动窗格中的可用空间简单地设置表格的全局行高:

import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

public class TableFillViewportHeight
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String[] columnNames = {
            "First Name", "Last Name", "Sport" };
        Object[][] data = {
            {"Kathy", "Smith", "Snowboarding" },
            {"John", "Doe", "Rowing" },
            {"Sue", "Black", "Knitting"},
            {"Jane", "White", "Speed reading" },
            {"Joe", "Brown", "Pool" }
        };

        final JTable table = new JTable(data, columnNames);
        final JScrollPane scrollPane = new JScrollPane(table);
        table.addComponentListener(new ComponentAdapter()
        {
            @Override
            public void componentResized(ComponentEvent e)
            {
                table.setRowHeight(16);
                Dimension p = table.getPreferredSize();
                Dimension v = scrollPane.getViewportBorderBounds().getSize();
                if (v.height > p.height)
                {
                    int available = v.height - 
                        table.getRowCount() * table.getRowMargin();
                    int perRow = available / table.getRowCount();
                    table.setRowHeight(perRow);
                }
            }
        });

        f.getContentPane().add(scrollPane);
        f.setSize(500,500);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

但请注意,这是解决此问题的一种...有点“实用”的方法,并且仅使用(并打算用于)默认表的最简单情况进行测试。更优雅、更灵活的解决方案可能需要付出更多努力。

【讨论】:

    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 2011-12-13
    • 2017-11-01
    • 1970-01-01
    • 2020-02-16
    • 2017-10-19
    • 2020-11-24
    • 2012-07-23
    相关资源
    最近更新 更多