Java Swing開発のベストプラクティスは何ですか?


17

この質問の事前調査を行っているときに、インターネット上にはJava Swingのベストプラクティスに関するよく整理された情報があまりないことがわかりました。だから、私はStack ExchangeにそのOne Great Listの構築を試してみるつもりです。

Java Swing開発のベストプラクティスは何ですか?何があなたのために働いているとわかったのですか?


2
私は学校でSwingをプレイしましたが、楽しい経験ではありませんでした。全体が肥大化し、不必要に複雑に見えました。ベストプラクティスは、他の何か
ロバートハーヴェイ

1
@RobertHarveyの「学校で遊ぶ」ことは、プロダクションソフトウェアの提供とはかけ離れています。Swingは合理的で論理的な方法で必要なすべてを実行できることがわかりました。

まあ、このように言えば:もしそれが単なる学校のプロジェクトでそんなに難しかったなら、実際のプロジェクトではほとんど想像を絶するほど難しいでしょう。
ロバートハーヴェイ

1
@RobertHarvey powerには価格が付属しています

もう1つ重要なことです。Swingコンポーネントはシリアライズ可能であり、多くの祖先を持っています。そのため、ほとんどの場合、それらは継承するには重すぎます。特に、シリアル化できない状態になっている場合は、ラッピングの手法を検討する必要があります。コンポーネントから継承する場合は、それをビューとして(MVCまたは同様のパターンで)使用します。
ダヴィッドホル

回答:


12

私は私のために働いていたものについてのみ答えることができます。他のコメンテーターは、Java GUIは一般に、まったくネイティブではないルックアンドフィールの「不気味な谷」に陥ると指摘していますが、私はこれに異議を唱えません。

Action APIを十分に活用してください。これにより、ユーザーが実行するさまざまなアクションをより適切にカプセル化し、ショートカット、アクセラレータキー、ボタン、およびその他の入力オブジェクトにより簡単に結び付けることができます。

適切なレイアウトマネージャーを使用します。GridBagLayoutは非常に強力ですが、コメントの量が多くなければ維持できないと言っても過言ではありません。保守している古いGUIアプリでSonarなどの静的コード分析ツールを実行すると、GridBagsのレイアウトを適切にするために、大量のマジックナンバーが常に指摘されます。GroupLayoutで多くの成功を収めています。これにより、ピクセル単位の完全な配置を指定する必要がなくなります。

JDialogが必要だと思う場合は、おそらく必要ありません。ダイアログボックスは、ユーザーエクスペリエンスの点で恐ろしいものです。このアプリケーションは、すべてのメニューとフォームにダイアログボックスを使用し、奇妙な方法で最前面のルールを適用することにしました。これは、実際にメニュー上で何かを警告する必要があるときに、メンテナンスの悪夢に変わりました。キューは、フォーカスできないダイアログ(したがって、却下できないダイアログ)をクリックすることに不満を感じました。

必要に応じて、独自のマルチスレッドを実行する代わりにSwingWorkerを使用します。GUIに定期的な更新を提供しながら、SwingWorkerを拡張し、長時間実行するタスクを実行するのは非常に簡単です。クライアントアップデートのダウンロードを検討してください。ワーカースレッドのスケジューリングを処理し、ダウンロードの割合をビューにパブリッシュして、ProgressBarまたはあなたが持っているものを更新できるようにします。

明らかに限られた経験の中で、それが私が提案できるすべてです。


2
JDialogダイアログに使用する限り、まったく問題ありません。
ジョナス

1
あなたが絶対に見なければならない、そしてすぐに行動しなければならない情報のためにあなたがそれらを使用しているなら、私は彼らが大丈夫であることに同意します。しかし、ほとんどの情報はユーザーエクスペリエンスをそれほど混乱させる必要はありません。それが私の予選の背後にあったポイントでした。
トムG

@Jonas私はポイントがダイアログが悪いことであると思う(それらが実装されているかどうかに関係JDialogなく)。
トムホーティン-タックライン

1
カップリングは少し悪臭を放ちますが、独自のスレッドコードを記述するよりもIMOの方が優れています。微妙なスレッドのバグではなく、洗練されていないコードを扱います。
トムG

3
MigLayout- miglayout.com

4

最初のことの1つは、直接それに取り組むことではないと思います。Swing(IMHO)のレイアウトシステムはひどいものであり、そこから実質的なアプリを作成しようとするのは悪夢です。

私が使用した多くの代替レイアウトマネージャーのうちの2つは、MigLayoutおよびMultiSplitPaneレイアウトです。MigLayoutはより一般的な目的であり、考えられる任意のレイアウトを簡単かつ健全な方法で作成します。MultiSplitPaneはより具体的です。私はそれを使用して、あまり複雑ではないGUIの簡単なレイアウトを作成しました。

編集これはスイングを置き換えません。Swingを使用する必要がある場合は、これらのレイアウトマネージャーを使用できます。これらは、Swingを管理するだけであり、Swingを置き換えるものではないためです。


もちろん、より良い代替手段はSwingを使用しないことです。Swingは、作業が恐ろしく、ネイティブ見えず、遅いために厳しく批判されています。Qt、SWT、GTKのように、すべきではないことをSwingから学んだ多くの選択肢が存在します。これらは、Swingの頭痛に対する優れた長期的ソリューションです。

編集:@Lord Torgamusが言ったように、Swingの使用を強制された場合、これらは実際には利用できません。これらを使用してプロジェクトを作成するときにこれを解決するのが最善であり、3/4の方法ではなく、レガシアプリを選択する場合です。

また、代替GUIのほとんどはネイティブライブラリを使用しているため、オペレーティングシステムのように見えてから、Swingまたは他のPure Java GUIにフォールバックすることに注意してください。


4
私はあなたの意見に感謝しますが、「Swingを使用しない」は、何らかの理由でSwingを使用することを余儀なくされているため、この質問に終止符を打つ人にとっては役に立ちません。
ポップス

@Lordそのため、QTとSWTを提案する前に、代替のレイアウトマネージャーを提案しました。可能なパスを使用してください。
TheLQ

「Swing(IMHO)のレイアウトシステムはひどいもので、そこから実質的なアプリを作成しようとするのは悪夢です。」レイアウトマネージャーは、SwingではなくAWTから来る傾向があります。確かに、BoxLayoutやGroupLayoutなど、いくつかのSwing固有のものがあります。そうは言っても、レイアウトマネージャーは完全にオプションです。代わりに、.NET WinFormsで行うように各コンポーネントの座標を指定できます(ただし、.NETには便利なGUIがあります)。
パワーロード

3
MigLayout- miglayout.com

1
@TheLQ Ok Swingのファイルマネージャーについては同意します。これは本当にバカです(Mac OS Xでも)。とにかく、私はそれを修正するためにAWTのファイルマネージャを使用しています。アプリケーションの残りの部分がSwingを使用して作成されている場合でも正常に動作します。
stommestack
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.