【发布时间】:2013-08-20 12:19:27
【问题描述】:
情况:抽一摞扑克牌,就像在纸牌游戏中一样。叠得很好。
为了实现这一点,我将JLayeredPane 与LayoutManager 接口的自定义实现结合使用。使用自定义 LayoutManager 的原因是堆栈方向不同,有时扑克牌完全相互覆盖,有时会部分覆盖,而这个逻辑对于 LayoutManager 来说似乎是一个很好的工作,因为这基本上归结为设置卡片。
所以,LayoutManager 负责设置堆栈中所有组件的 X 和 Y 坐标。另一方面,JLayeredPane 负责它们的 Z 坐标(通过其层)。
将组件添加到JLayeredPane 如下所示:
JLayeredPane pane = new JLayeredPane();
pane.setLayout(new StackLayout(...));
pane.add(new CardView(...), new Integer(j));
其中new Integer(j) 是卡片的层。由于JLayeredPane 的合同,这必须是Integer。
这里的问题是,由于上述原因,我的StackLayout 不能有除Integer 之外的任何其他约束对象。 LayoutManager接口需要你实现如下方法:
addLayoutComponent(Component comp, Object constraints);
而传递的Object 将永远是Integer。
在我的特殊情况下,我很幸运,因为我的 XY 坐标可以根据 Z 坐标计算。例如,k 层中的卡片必须位于 Y 坐标 k * offset。所以在我的情况下,约束对象是 Integer 不是问题。
我想知道当 Z 坐标和 XY 坐标之间没有相关性时你应该怎么做?那你怎么解决这个问题?例如,我如何将GridBagLayout 与JLayeredPane 结合使用,其中第一个需要GridBagConstraints 对象,第二个需要Integer 对象?当然,GBL 会以组件不重叠的方式进行布局,但这只是想法。
【问题讨论】:
-
您是否考虑过扩展 JLayeredPane,因为您需要更改基本行为?通过这种方式,您可以创建自己的 add 方法,该方法将允许使用其自己的特定 Object 2nd 参数,该方法结合了 JLayeredPane 超所需的 Integer ,如果布局使用 GridBagLayout 或类似的东西,可能还有 GridBagConstraints 。
-
@HovercraftFullOfEels 似乎这可能是正确的解决方案。我想我可能需要覆盖
protected void addImpl(Component comp, Object constraints, int index),其中JLayeredPane覆盖自身,首先拦截用于层确定的Integer对象。然后它将约束传递给它的超类Container,它最终不会对它做任何事情,因为默认JLayeredPane没有LayoutManager。我会为这种方法写一个答案。
标签: java swing constraints layout-manager jlayeredpane