誰もが使用しているJavaGUIレイアウトマネージャーは何ですか?最近、いくつかの強力なコンポーネントコントロールを備えたMigLayoutを使用しています。標準のJDK以外の開発者が何を使用しているかを確認したかっただけです。
22 に答える
MiGLayoutは、Java 開発者によって広く使用されている GUI レイアウト マネージャーです。
GridBagLayoutが使用可能です。あなたがそれを使うことに慣れたら、それは素晴らしい働きをします。標準のJDKレイアウトマネージャーは、それ自体でかなり強力だと思います。さらに、サードパーティのライブラリへの依存を最小限に抑えることができます。
MiG と FormLayout (JGoodies) はどちらも手動レイアウトに優れています (そして、ほとんどすべてのレイアウトが最終的に手動になります)。私の最大のアドバイスは、アプリケーションに影響を与えずにレイアウトを完全に削除して再実装できるようにビューを設計することです (ここでは、ビューとコントローラーを適切に分離することが重要です)。
「ダム」ビューを実装するための JGoodie の PresentationModel アプローチをぜひご覧ください。私はこの手法を GUI ビルダー (Jigloo GUI ビルダー プラグインで GroupLayout を使用) で使用して、簡単なプロトタイプを作成します。3 回または 4 回の反復の後、通常は窓の外に出て、MiG または FormLayout を使用して再実装します。
編集: これを書いてから、すべてのレイアウトに MiG を使用するようになり、GUI ビルダーは使用しなくなりました。MiG を使用して物事をレイアウトするのは簡単すぎます。
ほとんどのパネルにDesignGridLayoutを使用しています。
完全に処理できないまれなパネルにDesignGridLayout
は、Borderlayoutとを組み合わせて使用しDesignGridLayout
ます。
DesigngridLayoutを使用すると、入力と読み取りが簡単な最小限のコード行でレイアウトを手動でコーディングできます。
DesignGridLayouut layout = new DesignGridLayout(myPanel);
layout.row().grid(lblFirstName).add(txfFirstName).grid(lblSurName).add(txfSurName);
layout.row().grid(lblAddress).add(txfAddress);
layout.row().center().add(btnOK, btnCancel);
パネルグリッドの各行は、1行のコードで定義されます。ご覧のとおり、パネルの「描画」は非常に簡単です。
さらに、DesignGridLayout
いくつかのユニークな機能(「スマート垂直サイズ変更」など)があることがわかりました。
私が最後に取り組んだSwingアプリケーションは、JGoodiesのFormsLayoutを使用していました。
以前はコントロールにGridBagLayoutを使用していましたが、java1.6以降、GroupLayoutを使用するのは大変です。
ここにスクリーンショットとそれを使用するためのサンプルコードがあります!。
代替テキストhttp://img145.imageshack.us/img145/7844/screenshot1dz8.png
private void layoutComponents(){
JPanel panel = new JPanel();
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
SequentialGroup hGroup = layout.createSequentialGroup();
JLabel nameLbl = new JLabel("Name");
JLabel countLbl = new JLabel("Amount");
JLabel dateLbl = new JLabel("Date(dd/MM/yy)");
hGroup.addGroup(layout.createParallelGroup().
addComponent(nameLbl).
addComponent(countLbl).
addComponent(dateLbl).
addComponent(go));
hGroup.addGroup(layout.createParallelGroup().
addComponent(name).
addComponent(count).
addComponent(date));
layout.setHorizontalGroup(hGroup);
SequentialGroup vGroup = layout.createSequentialGroup();
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(nameLbl).addComponent(name));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(countLbl).addComponent(count));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(dateLbl).addComponent(date));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(go));
layout.setVerticalGroup(vGroup);
frame.add( panel , BorderLayout.NORTH );
frame.add( new JScrollPane( textArea ) );
}
GridBagLayoutを使用します。多くのコードが必要なようですが、非常に見栄えの良いレイアウトになります。
また、 BorderLayoutとGridBagLayoutパネルを組み合わせて、優れたカスタマイズ性を実現したいと思います。
私はGridBagLayout の代わりにTableLayoutを使用するのが大好きです。すべてが理にかなっていますが、GridBagLayout を使用しようとするたびに私の魂が押しつぶされます。
GridBagLayout は強力ですが、非常に原始的です。レイアウトを接続するコードは非常に冗長です。このユーティリティ ライブラリ (実際には約 10 個のクラスを含む 1 つの jar ファイル) は、多くの作業を簡素化します: http://code.google.com/p/painless-gridbag/次のスニペットは、そのサイトのホームページから引用されています:
PainlessGridBag gbl = new PainlessGridBag(getContentPane(), false);
gbl.row().cell(lblFirstName).cell(txtFirstName).fillX()
.cell(lblFamilyName).cell(txtFamilyName).fillX();
gbl.row().cell(lblAddress).cellXRemainder(txtAddress).fillX();
gbl.doneAndPushEverythingToTop();
一般的な概要として、かなり前に私が sun で書いた記事が役に立つと思うかもしれません。最新のレイアウト マネージャーには対応していませんが、1 つのレイアウトですべてを実行しようとするのではなく、レイアウト マネージャーを効果的にネストすることに重点を置いています。
http://developer.java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgrを参照してください。
自明ではない GUI では、ネストされたサブパネルを持つ複数のレイアウトを使用し、メイン パネルに がありGridBagLayout
、各サブパネル (通常は境界線やパネルであることを示すものなし) がより単純なレイアウトを使用することがわかりました。可能。通常、小さくて単純なサブパネルにはBorderLayout
、FlowLayout
、およびを使用します。BoxLayout
GUI の小さなセクションをサブパネルに分割し、可能な限り単純なレイアウトを使用して GUI のそのセクションを制御することにより、GridBagLayout
多くのオプションから頭を悩ませることなく、複雑で適切に配置されたディスプレイを作成できます。また、同様の表示機能をパネルにグループ化することで、より読みやすいコードを作成します。
NetBeansの一部である仮数GUIビルダー用に開発された春のレイアウト。
私は常にGridBagLayoutの大ファンでした。HTMLテーブルによく似ているため、これらのWebプログラマーにとって直感的です。
さまざまなネストされたレイアウトを使用することから始め、次にGridBagLayoutに移動しました(これはかなりイライラします)。それ以来、FormLayoutを試してみて(ただし、フォーム以外には適していないことがわかりました)、TableLayoutにしっかりと落ち着きました。これは、全体的に非常に満足しています。
それ以来、私はMiGLayoutを発見しました。それで遊ぶ以上のことはしていませんが、TableLayoutと非常によく似ており、おそらく少しすっきりしているようです。
私にとっての大きなプラスは、MiGLayoutがJDKの一部になるように設定されていることです。そのため、MiGLayoutを使用する場合にのみ使用するつもりです。
もう1つ覚えておくべきことは、どの重量のあるLayoutManagerを選択しても、GridLayoutなどのより単純なレイアウトマネージャーの場所が常に存在するということです。GridBagLayoutで行われるいくつかの恐ろしいことを見てきましたが、より単純なレイアウトマネージャーではるかに簡単に行うことができました。
GroupLayoutも使用しました。繰り返しますが、これは Java6 の標準の JDK レイアウト マネージャーですが、別のライブラリも見つけることができます。
私はサードパーティのライブラリへの依存を最小限に抑えることを好むので、通常、ダイアログには BoxLayout を、「複雑な」レイアウトには GridBagLayout を使用します。GridBagLayout は理解するのは簡単ですが、構成するのは少し難しいです。HTML レイアウトからコードを作成するためのツールを自分で作成しました (他の人にも役立つことを願っています): http://www.onyxbits.de/content/blog/patrick/java-gui-building-gridbaglayout-manager-made-easy
私は少しJava初心者です。
私はGridBagLayoutを試し、あきらめ、次にBoxLayoutを試し、次にあきらめ、そして機能する独自のカスタムレイアウトを作成しました。GridBagとBoxを使用して、私は最善の推測を行い、レイアウトエンジンは、それらをデバッグする明確な方法なしに、別のことを行うことにしました。
カスタムレイアウトを使用すると、座標、幅、高さを印刷して、どこが間違っているのかを見つけることができました。物事を配置するのは少し厄介ですが、組み込みのレイアウトマネージャーの1つの限られた語彙ではなく、Javaの全機能を使用できます。
もちろん、それは単なるホームプロジェクトのためであり、職場でこれを行うことは決して許されません。
レイアウトのようなフォームには GridBagLayout を使用し、単純なレイアウトには BorderLayout を使用し、間にスペースがある水平方向のアイコン/ボタンの数には FlowLayout を使用します。Netbeans は、多くの面倒なレイアウト コーディングを回避して時間を節約できる優れた GUI ビルダーでもあります。
私が実際に気に入っている唯一のレイアウト マネージャーはRelative Layout Managerです。Relative Layout Manager は、ダイアログ ボックスが概念的に編成されている方法と一致する方法で動作します。1 つの欠点は、このレイアウト マネージャーが付加的な制約を処理することです。比率の制約を扱っていないようです。幸いなことに、非常によく設計されており、この機能を実装することができました。
私は、多くの設定を必要とし、手動で行うのに非常に読みやすく、疲れるレイアウトマネージャーにうんざりしていたので、各コンポーネントを所定の位置に保持する2つのフォトコーナーの抽象化を使用する独自の非常に単純なラウトマネージャーを作成しました。次のようにコンポーネントを追加できます。parent.add(child,"topleft(0, 0.5)bottomright(0.5,1.0)");
ここを見てください https://github.com/hageldave/UsefulStuff/blob/master/src/PhotoCornersLayout.java ;)ただし、レイアウトのオーバーラップやその他の欠点をチェックしていないため、正しいレイアウトは自分で責任を負います。
BoxLayoutとSpringLayoutをネストしている間、 BorderLayoutを90% の時間使用します
最近 Swing を使い始め、GridBagLayout を使用しています。