4

状況: ソリティア ゲームのように、トランプのスタックを描画します。うまく積み上げられました。

これを実現するため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)カードのレイヤーはどこですか。これはIntegerの契約によるものに違いありませんJLayeredPane

ここでの問題は、上記の理由により、StackLayout以外の制約オブジェクトを持てないことです。インターフェイスでは、次のメソッドを実装する必要がありますIntegerLayoutManager

addLayoutComponent(Component comp, Object constraints);

ここで渡さObjectれたものは常にInteger.

私の特定の状況では、私の XY 座標は Z 座標に基づいて計算できるので、幸運です。たとえば、レイヤー内のカードはkY 座標に配置する必要がありますk * offset。したがって、私の状況では、制約オブジェクトであることIntegerは問題ではありません。

Z 座標と XY 座標の間に相関関係がない場合、どうすればよいのでしょうか。では、これをどのように解決できますか?たとえば、最初にオブジェクトが必要で、2 番目にオブジェクトが必要な場合、GridBagLayouta と a を組み合わせて使用​​するにはどうすればよいでしょうか。もちろん、GBL はコンポーネントが重ならないようにレイアウトしますが、それは単なるアイデアです。JLayeredPaneGridBagConstraintsInteger

4

2 に答える 2