有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使JScrollPane与嵌套的JTables一起正常工作?

我的问题是,当更多的行添加到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) 个答案

  1. # 1 楼答案

    这是因为你设置了

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

    因此inner{}的高度高于70是“好”的,并且不向父级请求更多空间JPanel panel,因为父级不会向其父级请求更多空间JVieport

    另外,如果您查看JTable的源代码,那么方法setFillsViewportHeight仅适用于javax.swing.JLayerjavax.swing.ScrollPaneLayoutjavax.swing.ViewportLayout(查看getScrollableTracksViewportHeight()的调用),因此只有当JTable在某个视口中时,此方法才起作用

  2. # 2 楼答案

    您可以将除一个滚动条外的所有滚动条设置为VERTICAL_SCROLLBAR_NEVER,并将一个滚动条设置为VERTICAL_SCROLLBAR_ALWAYS。然后将滚动条模型绑在一起,如@camickr show mehere