具有固定宽度的JScrollPane中的JTable

时间:2014-09-14 09:02:24

标签: java swing jtable jscrollpane layout-manager

我有一个带有几列的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个像素,但这似乎不太便于携带。有更好的解决方案吗?

1 个答案:

答案 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.是的,这是一个黑客攻击。但是,嘿,它有效!