4

我想把从 JTable 出来的对象分层放在它上面,所以使用 JLayeredPane 似乎很自然。然而,让这个正确地绘制,正确地做标题等等是非常困难的。我该如何做到这一点:

  • 滚动时出现并匹配行标题
  • 列标题在滚动时出现并匹配
  • 桌子正确上色
  • 调整大小不会搞砸一切

请注意,因为JDesktopPaneextends JLayeredPane,这个问题的答案也允许您在 aJTable后面有一个(或任何其他组件)JDesktopPane

4

1 回答 1

4

类似但不相同的问题有帮助: Java - Is it possible to put a JLayeredPane inside JScrollPane? 以及如何使用 JScrollPane 和 JLayeredPane在 JTable 单元和Swing GUI 设计中显示动画。

要正确执行此操作,需要考虑三个单独的问题:大小调整、标题和 UI 更改。

浆纱

要正确滚动和绘制,JScrollPane需要知道其中组件的大小和首选大小,在本例中为JLayeredPane. 但是您希望大小由表格设置,因为其他Components 将浮动在表格顶部。在这种情况下,最简单的方法是使 JLayeredPane 将与大小相关的属性设置JTable为如下。

final JTable table = new JTable();
JLayeredPane layers = new JLayeredPane() {
  @Override
  public Dimension getPreferredSize() {
    return table.getPreferredSize();
  }

  @Override
  public void setSize(int width, int height) {
    super.setSize(width, height);
    table.setSize(width, height);
  }

  @Override
  public void setSize(Dimension d) {
    super.setSize(d);
    table.setSize(d);
  }
};
// NB you must use new Integer() - the int version is a different method
layers.add(label, new Integer(JLayeredPane.PALETTE_LAYER), 0);
JScrollPane scrolling = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                                        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrolling.setViewportView(layers);

如果您不希望 theJTable成为决定 the 大小的东西,JLayeredPane那么它需要以其他方式确定,表格的大小也是如此。两者都需要setPreferredSize()setSize()明确地调用它们。

标头

由于 JTable 不再是视口,您需要自己链接标题。以下代码将起作用:

scrolling.setColumnHeaderView(table.getTableHeader());
scrolling.setRowHeaderView(rowHeader);

用户界面

另请注意,JTable 在configureEnclosingScrollPane()和中做了一些讨厌的代码configureEnclosingScrollPaneUI()。如果您想让 UI 样式更改正常工作,那么您必须重写这些方法,但我还没有弄清楚如何做到这一点。

于 2011-07-12T11:49:29.577 回答