使JTable行填充JScrollPane的整个高度

时间:2015-03-20 20:03:32

标签: java jtable jpanel jscrollpane

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

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

1 个答案:

答案 0 :(得分:2)

事实上,我对评论(或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);
    }
}

但请注意,这是......有点"务实"解决此问题的方法,并且仅针对默认表的最简单情况进行测试(并且用于)。更优雅和灵活的解决方案可能需要更多的努力。