事实上,我对 cmets(或类似 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);
}
}
但请注意,这是解决此问题的一种...有点“实用”的方法,并且仅使用(并打算用于)默认表的最简单情况进行测试。更优雅、更灵活的解决方案可能需要付出更多努力。