JScrollPane里面的JLayeredPane里面的JTable - 你如何让它工作?

时间:2011-07-12 11:38:49

标签: java swing jtable jscrollpane jlayeredpane

我想把JTable中的对象放在它上面,所以使用JLayeredPane看起来很自然。但是,要正确地绘制它,正确地执行标题等非常困难。我该怎么做才能:

  • 滚动标题出现并在滚动时匹配
  • 列标题在滚动时显示并匹配
  • 表格正确绘制
  • 调整大小不会弄乱一切

请注意,由于JDesktopPane扩展了JLayeredPane,因此此问题的答案还允许您在JTable后面加JDesktopPane(或任何其他组件)。

1 个答案:

答案 0 :(得分:4)

类似但不完全相同的问题有助于: Java - Is it possible to put a JLayeredPane inside JScrollPane?How to display animation in a JTable cell以及Swing GUI design with JScrollPane and JLayeredPane

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

调整大小

要正确滚动和绘制,JScrollPane需要知道其中组件的大小和首选大小,在本例中为JLayeredPane。但是你想要通过表来设置大小,因为其他Component将浮动在表的顶部。在这种情况下,最简单的方法是将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);

如果你不希望JTable成为确定JLayeredPane大小的东西,则需要以其他方式确定,表的大小也是如此。两者都需要明确调用它们setPreferredSize()setSize()

标题

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

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

UI

另请注意,JTable在configureEnclosingScrollPane()configureEnclosingScrollPaneUI()中执行了一些讨厌的代码。如果您希望UI样式更改能够正常工作,那么您必须覆盖这些方法,但我还没有弄清楚如何执行此操作。