状況: ソリティア ゲームのように、トランプのスタックを描画します。うまく積み上げられました。
これを実現するため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
以外の制約オブジェクトを持てないことです。インターフェイスでは、次のメソッドを実装する必要がありますInteger
。LayoutManager
addLayoutComponent(Component comp, Object constraints);
ここで渡さObject
れたものは常にInteger
.
私の特定の状況では、私の XY 座標は Z 座標に基づいて計算できるので、幸運です。たとえば、レイヤー内のカードはk
Y 座標に配置する必要がありますk * offset
。したがって、私の状況では、制約オブジェクトであることInteger
は問題ではありません。
Z 座標と XY 座標の間に相関関係がない場合、どうすればよいのでしょうか。では、これをどのように解決できますか?たとえば、最初にオブジェクトが必要で、2 番目にオブジェクトが必要な場合、GridBagLayout
a と a を組み合わせて使用するにはどうすればよいでしょうか。もちろん、GBL はコンポーネントが重ならないようにレイアウトしますが、それは単なるアイデアです。JLayeredPane
GridBagConstraints
Integer