如何使用嵌套的JTable使JScrollPane正常工作?

时间:2012-06-08 09:33:07

标签: java swing jtable jpanel jscrollpane

我遇到的问题是,当更多行添加到JTable(jtbls)时,垂直滚动条不会出现在我的JScrollPane(外部)上。

JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1, 4));
JScrollPane outer = new JScrollPane(panel);

jtbls = new JTable[4];
for (int i = 0; i < jtbls.length; i++) {
    jtbls[i] = new JTable(new MyTableModel());
    jtbls[i].setFillsViewportHeight(true);
    jtbls[i].setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));

    JPanel inner = new JPanel(new BorderLayout());
    inner.add(jtbls[i], BorderLayout.CENTER);
    inner.add(jtbls[i].getTableHeader(), BorderLayout.NORTH);
    inner.setPreferredSize(new Dimension(outer.getWidth() / 4, 70));

    panel.add(inner);
}

add(outer);

Screenshot

2 个答案:

答案 0 :(得分:2)

您可以将其中一个滚动条设置为VERTICAL_SCROLLBAR_NEVER,并将其中一个设置为VERTICAL_SCROLLBAR_ALWAYS。然后将滚动条模型绑在一起,就像@camickr向我展示here

答案 1 :(得分:1)

这是因为你设置了

inner.setPreferredSize(new Dimension(outer.getWidth() / 4, 70));

所以inner JPanel“高”,其高度超过70,并且不会向父级请求更多空间 - JPanel panel不会请求更多空间它的父母 - JVieport

另外,如果您查看JTable的源代码 - 方法setFillsViewportHeight仅适用于javax.swing.JLayerjavax.swing.ScrollPaneLayoutjavax.swing.ViewportLayout(请参阅调用getScrollableTracksViewportHeight()) - 所以只有当JTable在某个视口内时才会起作用。