我想把从 JTable 出来的对象分层放在它上面,所以使用 JLayeredPane 似乎很自然。然而,让这个正确地绘制,正确地做标题等等是非常困难的。我该如何做到这一点:
- 滚动时出现并匹配行标题
- 列标题在滚动时出现并匹配
- 桌子正确上色
- 调整大小不会搞砸一切
请注意,因为JDesktopPane
extends JLayeredPane
,这个问题的答案也允许您在 aJTable
后面有一个(或任何其他组件)JDesktopPane
。
我想把从 JTable 出来的对象分层放在它上面,所以使用 JLayeredPane 似乎很自然。然而,让这个正确地绘制,正确地做标题等等是非常困难的。我该如何做到这一点:
请注意,因为JDesktopPane
extends JLayeredPane
,这个问题的答案也允许您在 aJTable
后面有一个(或任何其他组件)JDesktopPane
。
类似但不相同的问题有帮助: Java - Is it possible to put a JLayeredPane inside JScrollPane? 以及如何使用 JScrollPane 和 JLayeredPane在 JTable 单元和Swing GUI 设计中显示动画。
要正确执行此操作,需要考虑三个单独的问题:大小调整、标题和 UI 更改。
要正确滚动和绘制,JScrollPane
需要知道其中组件的大小和首选大小,在本例中为JLayeredPane
. 但是您希望大小由表格设置,因为其他Component
s 将浮动在表格顶部。在这种情况下,最简单的方法是使 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 样式更改正常工作,那么您必须重写这些方法,但我还没有弄清楚如何做到这一点。