gpt4 book ai didi

java - 使 JTable 行填满 JScrollPane 的整个高度

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:21:00 26 4
gpt4 key购买 nike

我在 JPanel 内的 JScrollPane 内有一个 JTable。我想让 JTable 的行填满 JPanel 的整个高度。比如,如果我有 10 行,它们会在高度方向上拉伸(stretch)并填满整个 JPanel,如果我再添加 10 行,这些行的大小应该调整以便我可以容纳 JPanel 中的所有 20 行。

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

最佳答案

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

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

对于最简单的情况,ComponentListener 可能是一种选择,它可以根据封闭滚动 Pane 中的可用空间简单地设置表格的全局行高:

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);
}
}

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

关于java - 使 JTable 行填满 JScrollPane 的整个高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29174942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com