web-dev-qa-db-ja.com

どのSwingレイアウトをお勧めしますか?

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

先日、SpringLayoutを使おうとしましたが...うまくいきませんでした。 他の質問 を参照してください。だから...デザインするSwingアプリがあり、レイアウトをちょうどいいにしたい場合、あなたの好みのレイアウトマネージャーは何ですか?関連する興味深い/有用な経験はありますか?

更新:はい、確かに、異なるLMは異なるレイアウトに適していることを認識しています。しかし、ほとんどの人は、ほとんどすべての操作に1、2、または3を使用するか、他の何も必要としない非常に汎用性の高い1つを使用することを期待しています。十分な応答があれば、GridBagLayoutまたはMigLayout(たとえば)にピークがあり、(たとえば)BoxLayoutまたはFlowLayoutを使用するいくつかのストラグラーの長い尾を持つ、ベル曲線のようなものが表示されることを期待します。

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


更新と要約

OK、ほぼ2日後、MiGLayoutは間違いなく最前線にいます!ファンは、このレイアウトがまもなく「公式」ライブラリに追加されるようだと聞いて喜んでいるでしょう。

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

43
Carl Smotricz

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

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

62
Joonas Pulakka

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

GridBagLayoutGroupLayout(および多くのサードパーティのもの)などの「すべてを単一のパネルで行う」レイアウトマネージャーは、主にレイアウトのさまざまな部分のコンポーネントを揃える必要がある場合に適しています。 、しかし、レイアウトが大きい場合、一般的には扱いにくい巨大な混乱になります。

22

作成するGUIの種類によって異なります。 1つまたは2つの単純なレイアウトを使用するか、より高度なレイアウトに到達する必要がある場合があります。私の全体的なレイアウトマネージャーの使用方法は、プロジェクトによって異なりますが、おそらく次のようになります。

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

GridBagLayoutのコツをつかめば、最初に書くのはそれほど悪くはありませんが、それでも動作したり、後でデバッグしたりするのはまだきれいではありません。最近、MiGLayoutを試してみましたが、実際にはMiGLayoutが実際にはmore GridBagLayoutよりも複雑であることに気付いて失望しました。

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

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

17
rob

DesignGridLayout 両方とも見栄えがよく、fluent interfaceを介して簡単に使用できます。

例を見てください:

enter image description here

ほんの数行のきれいなコードで:

    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);
15
mantrid

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

  1. BorderLayout、シンプルで、通常のコンテンツフレームを設計するのに非常に便利です(メインコンテンツは中央に、ヘルパーは両側にあります)。
  2. GridLayout、同じサイズにする必要があるオブジェクトのグリッドがある場合に便利です(ボタン?テキストフィールド?)。
  3. GridBagLayoutは非常に柔軟性があり、微調整する必要があり、非常に冗長です(ただし、物事をうまくやるにしたい場合はraccomendします)。
  4. FlowLayout、役に立たない..あまりレイアウトではありません:アイテムを隣同士に配置するだけです。
  5. CardLayout、切り替える必要があるタブまたはサブビューに便利です。
  6. BoxLayout、あまり使用しません。これは一種の拡張FlowLayoutである必要がありますが、集中的に使用するには柔軟性が十分ではありません。
11
Jack

GroupLayout はかなりまともです。もともとはGUIビルダーアプリケーションで使用するためのものでしたが、手作業でコーディングするのも非常に簡単であることがわかりました。

9
ninesided

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

人間が読めるテキストでレイアウトを指定し、コンポーネントを追加します。できた.

8
clartaq

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

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

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

私は通常 border layout with gridlayout を使用します。まず、紙のプロトタイプでUIを設計します。

alt text
(ソース: sernomics.com

その後、画面をborderlayoutのgridlayoutに分割できます。この図では、NORTH、CENTER、SOUTHパーツ(BorderLayout要素)が表示され、すべてのパーツのレイアウトはgridlayoutまたはBorderLayoutになります。同じレイアウトで、一方を他方の中で使用できます。

6
baybora.oren

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

5
Bart Kiers

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

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

5
glebm

私はGridBagLayoutのみを使用します。特に複雑なインターフェースを行う場合は、GridBagLayoutが何でもできると信じています。 FlowLayoutもお勧めします。これは、ボタンのグループを配置するのに使いやすく、理解しやすいためです。 MigLayoutに関してはJDKライブラリの一部であるため、実際にはこの2つのレイアウトのみを使用します。まだ試していないので、現時点ではお勧めできません。

4
jerome

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

MiGLayout
TableLayout
GroupLayout
FormsLayout

これらのうち、MigLayoutはスイングレイアウトマネージャーであるため、最も推奨されるものです。そこに他の人はあまり露出していません。

3
Joy Malik

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

シェルドン

2
Sheldon R.