我有一个带有几列的JTable,可能还有很多行。我只希望一次显示3行,我希望JTable的宽度为400,包括滚动条的宽度。
这是我到目前为止的代码:
public class SwingDrivesMeMad
{
public static void main(String[] args)
{
Object[][] rowData = { {"Homer", "beer"},
{"Marge", "wine"},
{"Bart", "coke"},
{"Lisa", "water"},
{"Maggie", "milk"} };
Object[] headerData = { "name", "beverage" };
JTable table = new JTable(rowData, headerData)
{
public Dimension getPreferredScrollableViewportSize()
{
return new Dimension(400, getRowHeight() * 3);
}
};
JScrollPane scrollPane = new JScrollPane(table);
JFrame frame = new JFrame("learn you a barkeep for great good!");
frame.add(scrollPane);
frame.pack();
frame.setVisible(true);
}
}
它的外观如下:
高度很完美。不幸的是,宽度为400 加滚动条的宽度,总共为415.这会弄乱布局,因为在桌子正上方有一个固定宽度为400的图形区域,并且两个组件应完美排列。桌子稍微大一点看起来很糟糕。
当然我可以简单地将宽度设置为385,因为在我的系统上,滚动条似乎占用了15个像素,但这似乎不太便于携带。有更好的解决方案吗?
答案 0 :(得分:1)
不幸的是,所提出的解决方案都没有像素完美。所以我想出了一个黑客:
首先尝试宽度为400,然后计算实际宽度,最后校正多余的宽度?
JTable table = new JTable(rowData, headerData)
{
private static final int DESIRED_WIDTH = 400;
Dimension dim = new Dimension(DESIRED_WIDTH, Integer.MAX_VALUE);
{
JScrollPane dummy = new JScrollPane(this);
dummy.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
JFrame frame = new JFrame();
frame.add(dummy);
frame.pack();
int actualWidth = dummy.getSize().width;
frame.dispose();
int excess = actualWidth - DESIRED_WIDTH;
dim = new Dimension(DESIRED_WIDTH - excess, getRowHeight() * 3);
}
public Dimension getPreferredScrollableViewportSize()
{
return dim;
}
};
现在scrollPane.getSize().width
正好是400.是的,这是一个黑客攻击。但是,嘿,它有效!