我想把JTable中的对象放在它上面,所以使用JLayeredPane看起来很自然。但是,要正确地绘制它,正确地执行标题等非常困难。我该怎么做才能:
请注意,由于JDesktopPane
扩展了JLayeredPane
,因此此问题的答案还允许您在JTable
后面加JDesktopPane
(或任何其他组件)。
答案 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);
另请注意,JTable在configureEnclosingScrollPane()
和configureEnclosingScrollPaneUI()
中执行了一些讨厌的代码。如果您希望UI样式更改能够正常工作,那么您必须覆盖这些方法,但我还没有弄清楚如何执行此操作。