0

次のコードで循環参照が2回設定されている理由を誰か説明できますか?

//declare panel
this.cntnrPnl = new JPanel();
//define layout manager for the panel - but why circ ref?
this.cntnrPnl.setLayout(new BoxLayout(this.cntnrPnl, BoxLayout.Y_AXIS));

舞台裏で設定自体を行い、コードのコンパクト化のためにセッターを使用するのではなく、BoxLayoutバックをJPanelコンテナーに明示的に リンクする必要があるのはなぜですか?JPanel.setLayoutBoxLayout

例えば:

this.cntnrPnl.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
//and then in JPanel.setLayout have something line
_layout.setContainer(this);
4

3 に答える 3

2

BoxLayout は、レイアウトするターゲット コンテナーへの参照を必要とする特別なレイアウトであるためです。これは、すべてのレイアウト マネージャーに当てはまるわけではありません。setLayout()メソッドに BoxLayout の特定のケースを追加するのは醜いでしょう。また、必須のターゲット コンテナーがまだ存在しないため、BoxLayout は構築後に不安定な状態になることも意味します。

setLayout(this)逆に、ターゲット コンテナーでBoxLayout コンストラクターを呼び出すこともできます。しかし、なぜそれが行われていないのかわかりません。

于 2012-12-10T22:18:16.913 に答える
1

舞台裏で設定自体を行い、コードのコンパクト化のためにセッターを使用するのではなく、BoxLayoutバックをJPanelコンテナーに明示的にリンクする必要があるのはなぜですか?JPanel.setLayoutBoxLayout

あなたが呼ぶJPanel.setLayoutのは、実際にはContainer.setLayoutです:

public void setLayout(LayoutManager mgr)

メソッドを呼び出して a を使用しているBoxLayoutためimplements LayoutManagerです。ただしLayoutManagersetContainerメソッドがないため、そのメソッドを追加しないと機能しません。しかし、ほとんどのレイアウト マネージャーはコンテナーを気にしないように思われるため、メソッドはコンテナーに属しません。

BoxLayoutコンストラクターが魔法を行うことは可能でしょうか? そうではないかもしれませんが、 aBoxLayoutは a に結び付けられていますContainerが、その逆は必ずしも真ではありません。検討:

this.cntnrPnl = new JPanel();
BoxLayout bY = new BoxLayout(this.cntnrPnl, BoxLayout.Y_AXIS);
BoxLayout bX = new BoxLayout(this.cntnrPnl, BoxLayout.X_AXIS);

this.cntnrPnl.setLayout(bX)これで、さまざまな時間にとを呼び出すことができますthis.cntnrPnl.setLayout(bY)

したがって、すべてのオプションを見ると、現在の API が最適であるように見えますが、もちろんこれはすべて主観的なものです。

ところで、 に改名cntnrPnlすることを検討してくださいcontainerPanel。母音を取り除いてもあまり節約にはなりません。

于 2012-12-10T22:53:31.217 に答える
0

Swingで使用できるコンテナはJPanelだけではないためです。特に、独自のコンテナクラスを作成しても、BoxLayoutのこれらの特別な要件について知らない場合があります。その結果、レイアウトマナターは実装では機能しません。

ここで、BoxLayoutが最初にJPanelへの参照を必要とする理由を尋ねることができますが、これは別の問題です。

于 2012-12-10T22:08:17.540 に答える