43

Java ライブラリだけでも 8 つのレイアウト マネージャーがあり、サードパーティ製品もたくさんあります。

先日、SpringLayout を使おうとしたのですが、うまくいきません。私の他の質問を参照してください。では、設計する Swing アプリがあり、そのレイアウトが必要場合、優先するレイアウト マネージャーは何ですか? 関連する興味深い/有用な経験はありますか?

更新:うん、レイアウトごとに異なる LM が適切であることは承知しています。しかし、ほとんどの場合、ほとんどすべての操作に 1、2、または 3 を使用していると思います。または、非常に用途が広く、他に何も必要ない 1 つを使用することを誓います。十分な数の回答があれば、GridBagLayout または MigLayout (たとえば) でピークを迎え、BoxLayout または FlowLayout を使用するいくつかのストラグラーのロングテールを伴う、釣鐘曲線のようなものが見られると予想します。

うまくいけば、回答の分布によって、人々がGet Stuff Done ™を最もよく使用するものについての傾向が明らかになるでしょう。


更新とまとめ

OK、ほぼ 2 日後、MiGLayout は間違いなく前に出ています! そのファンは、このレイアウトがまもなく「公式」ライブラリに入るように見えると聞いて喜んでいるでしょう.

GroupLayout、FormsLayout、および TableLayout は比較的新しく、あまり公開されていません。おそらく、私と同じように彼らのことを知って驚く人もいるでしょう。

4

14 に答える 14

65

MiGLayout、間違いありません。正直なところ、これは私が知っている唯一の Swing レイアウト マネージャーです。

コア JDK に 8 つのレイアウト マネージャーがあるという事実だけでも、Swing の作成者が何をしようとしているのかまったくわかっていないことを示す良い兆候です。これは、Swing の残りの部分を台無しにするためではありません。これは、レイアウト マネージャーを除いて、優れた GUI ツールキットです。

于 2009-12-02T11:55:09.950 に答える
23

それらすべてを組み合わせて。それが要点です。各レイアウトマネージャーはさまざまな要件を満たし、さまざまなレイアウトマネージャーでパネルをネストすることで、ほぼすべてを実現できます。

GridBagLayoutおよび(および多くのサードパーティ製のもの)のような「単一のパネルですべてを行う」レイアウトマネージャーはGroupLayout、主にレイアウトのさまざまな部分のコンポーネントを整列させる必要がある場合にその役割を果たしますが、レイアウトが大きいと、通常、巨大で扱いにくい混乱。

于 2009-12-03T07:23:14.317 に答える
18

作成している GUI の種類によって異なります。シンプルなレイアウトを 1 つまたは 2 つだけ使用する場合もあれば、より高度なレイアウトに手を伸ばす必要がある場合もあります。私の全体的なレイアウト マネージャーの使用は、プロジェクトによって異なりますが、おそらく次のようになります。

  • 65% GridBagLayout - 何をする必要があるとしても、1 つのレイアウトで完了します。
  • 15% Box/BoxLayout - いくつかのコンポーネントをすばやく簡単に貼り付けるのに最適です。
  • 12% BorderLayout - ボタン パネルまたは情報パネルをコンテンツ パネルに取り付けるのに適しています。ほとんどの場合、JFrame にコンテンツを追加するために使用します。
  • 3% FlowLayout - ボタン パネルに役立ちますが、それ以外にはあまり役に立ちません。
  • 3% CardLayout - 操作モードごとに異なるコンテンツ パネルを表示するプログラムで主に役立ちます。
  • 2% その他のレイアウト - 他のレイアウトが必要になることはめったにありませんが、他のレイアウトのいずれかが役立つ場合があります。

GridBagLayout のコツをつかめば、最初に書くのはそれほど悪くありませんが、後で作業したりデバッグしたりするのはまだうまくいきません。私は最近何かのために MiGLayout を試しましたが、MiGLayout は実際には、その特定のケースで GridBagLayout よりも使用するのがより複雑であることがわかってがっかりしました。

疫病のように GridBagLayout を避けようとする人もいます。しかし実際には、単純なレイアウトの組み合わせでは処理できないことがあります。GUI を異なる論理セクションのパネルに分割することは問題ありませんが、コンポーネントを配置するためだけに不要な余分なネストされたパネルを大量に作成している場合は、明らかに GridBagLayout (またはその他の同様に高度なレイアウト (MiGLayout など)。入れ子になった BorderLayouts と GridLayouts と BoxLayouts の厄介な混乱で GUI を正常に見せることができるかもしれませんが、誰かがアプリケーション ウィンドウとダイアログのサイズを変更して、最初に設計したものよりも小さくまたは大きくし始めるとすぐに、GUI はおそらくひどいものになります。あなたの顧客はあなたの製品について否定的な意見を持ち始めます。

更新: 私はしばらくの間、Eclipse で WindowBuilder を使用してきました。これにより、多くのレイアウト、特に GridBagLayout の操作が大幅に簡素化されます。以前は手動でレイアウトを作成するのに多くの時間を費やしていましたが、WindowBuilder またはおそらく同様の高度なビジュアル エディターを使用すると、はるかに短い時間でレイアウトを作成できます。

于 2009-12-03T08:12:10.053 に答える
15

DesignGridLayoutどちらも見栄えがよく、流暢なインターフェースで簡単に使用できます。

例を見てください:

ここに画像の説明を入力

わずか数行のきれいなコードで:

    layout.row().grid(label("Last Name"))   .add(lastNameField) .grid(label("First Name"))  .add(firstNameField);
    layout.row().grid(label("Phone"))       .add(phoneField)    .grid(label("Email"))       .add(emailField);
    layout.row().grid(label("Address 1"))   .add(address1Field);
    layout.row().grid(label("Address 2"))   .add(address2Field);
    layout.row().grid(label("City"), 1)     .add(cityField);
    layout.row().grid(label("State"))       .add(stateField)    .grid(label("Postal Code")) .add(postalField);
    layout.row().grid(label("Country"), 1)  .add(countryField);
    layout.emptyRow();
    layout.row().center().add(newButton).add(deleteButton).add(editButton).add(saveButton).add(cancelButton);
于 2013-03-15T07:30:01.957 に答える
12

必要なレイアウトの種類によって異なります。そのため、8つあります。

  1. BorderLayout、シンプルで、通常のコンテンツフレームをデザインするのに非常に便利です(メインコンテンツが中央にあり、ヘルパーが側面にあります)。
  2. GridLayout、同じサイズである必要があるオブジェクトのグリッドがある場合に便利です(ボタン?テキストフィールド?)。
  3. GridBagLayout、非常に柔軟性があり、細かく調整する必要があり、非常に冗長です(ただし、うまくやりたい場合は、それをお勧めします)。
  4. FlowLayout、役に立たない..あまりレイアウトではありません。アイテムを並べて配置するだけです。
  5. CardLayout、切り替える必要のあるタブまたはサブビューに役立ちます。
  6. BoxLayout、あまり使用したことはありません..一種の拡張機能である必要がありますが、FlowLayout集中的に使用するには十分な柔軟性がありません。
于 2009-12-02T11:57:27.520 に答える
9

GroupLayoutはかなりまともです。もともとはGUIBuilderアプリケーションでの使用を目的としていましたが、手作業でのコーディングも非常に簡単であることがわかりました。

于 2009-12-02T12:02:24.257 に答える
8

FormLayoutJGoodiesフォームパッケージの一部は私にとって主力製品でした。デザインの見栄えを良くするために一生懸命働くという点で、完全に柔軟ではありません。私はこれを数十のプロジェクトで数年間使用してきましたが、見栄えの良い出力をすばやく生成し続けています。

人間が読めるテキストでレイアウトを指定してから、コンポーネントを追加します。終わり。

于 2009-12-02T14:19:44.970 に答える
7

私は通常、 gridlayoutでボーダーレイアウトを使用します。最初に、次のような紙のプロトタイプで UI を設計します。

代替テキスト
(出典: usernomics.com )

その後、borderlayout で画面を gridlayout に分割できます。この図では、NORTH、CENTER、SOUTH の部分 (BorderLayout 要素) が表示されており、すべての部分のレイアウトは gridlayout または BorderLayout にすることができます。同じレイアウトは、他のレイアウト内で 1 つを使用できます。

于 2009-12-03T07:01:47.073 に答える
6

GridBagLayout. あなたが必要とするほとんどすべてのことを(一種の)行い、それはJavaライブラリにあります。確かに、何らかの助けが必要であり、API はひどいものです。

GroupLayoutレイアウトコードを本当に混乱させます。さて、ほとんどの人の GUI コードは大きな泥だんごです。しかし、あなたのものである必要はありません!おそらく、このレイアウト マネージャーに優れたインターフェイスを配置できますが、複製して所有する必要があるのではないかと思います。

本当に必要でない限り、外部依存関係を導入することには賛成しません。また、サードパーティのレイアウト マネージャーの多くはデータの文字列を使用しており、これには通常の問題がすべてあります。

于 2009-12-02T13:09:30.137 に答える
5

GUIデザイナーでIntelliJIDEAを使用します。GridBagLayoutを簡単にします。

http://madbean.com/anim/totallygridbag/

于 2009-12-02T12:02:12.707 に答える
5

あなたの質問に対する本当の答えはありませんが、それは場合によります。作成しようとしているフレーム (フォーム) の種類によって異なります。私は Swing の第一人者ではありませんが、いくつかの (ある程度高度な) GUI を作成しましたが、GridBagLayout マネージャーに触れる必要はありませんでした。私は常に、「より簡単な」レイアウト マネージャーを組み合わせて GUI を作成することができました。たとえば、フレームに BorderLayout を指定し、その BorderLayout の SOUTH に別のレイアウトを配置できます。

于 2009-12-02T11:54:41.847 に答える
4

GridBagLayout特に複雑なインターフェースを行うときは、何でもできると信じていGridBagLayoutます。FlowLayoutも使いやすく、分かりやすく、ボタン群の配置に適しているのでオススメです。実際には、JDK ライブラリの一部であるため、この 2 つのレイアウトのみを使用MigLayoutします。まだ試していないため、現時点ではお勧めできません。

于 2012-08-28T13:32:10.017 に答える
3

次のレイアウト オプションを使用できます。

MiGLayout
TableLayout
GroupLayout
FormsLayout

上記のうち、swing レイアウト マネージャーである MigLayout が最も推奨されます。他の人はあまり露出していません。

于 2011-09-05T11:18:03.353 に答える
2

私は Swing 初心者ですが、最初の Swing アプリケーションを作成する過程で、FlowLayout、BoxLayout、GridLayout、および GroupLayout の 4 つの異なるレイアウト マネージャーを試しました。私の意見では、FlowLayout と BoxLayout は、同じようなサイズのコンポーネントのグループをレイアウトするのに最も適しているようです。さまざまなサイズのコンポーネントの場合、GroupLayout が適しているようです。他の 2 つよりも学習曲線は急ですが、それだけの価値はあります。GridLayout については、FlowLayout と BoxLayout を組み合わせて使用​​することで、そのレイアウト マネージャーと同じ結果を得ることができると私は主張します。おそらく、コンポーネントの配置をより詳細に制御できるでしょう。しかし、多分それは私だけです:)

シェルドン

于 2012-02-03T22:47:55.720 に答える