Java GUIフレームワーク。何を選ぶ?Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot?[閉まっている]


228

Java用のGUIフレームワークはかなりたくさんありますが、今日のフレームワークとして認識されているものは何ですか?

以下は、さまざまなフレームワークに対する私の理解です。間違っている場合は修正してください。これは非常に大まかに定義された一連の質問ですが、リッチなGUIアプリケーションの作成を考えている人にとっては、それでも価値があると思います。


AWT

Swingの基盤であり、パフォーマンスは良好ですが、高度なコンポーネントが不足しています。リッチなアプリケーションを作成するつもりなら、AWTはおそらく進むべき道ではありません。ただし、リッチなユーザーインターフェイスを必要としない小さなGUIアプリケーションの場合。これは、実証済みのフレームワークであるため、完全に適合します。


スイング

前述のAWTに基づいています。初期の段階では、それは低速でバグが多いと見なされ、IBMにEclipse用のSWTを作成させました。ただし、Java 5(または6)では、Swingが新しいアプリケーションを構築するための選択のフレームワークになりました。Swingには豊富なコンポーネントがたくさんありますが、一部の領域ではまだ不足しています。1つの例は、並べ替えやフィルタリング/検索を実行できるフル機能のTreeTableコンポーネントがないことです。


SWT

IBMがEclipseのために作成した彼らは、当時のSwingはEclipseには適していないと考えていたようです。それ自体はかなり低レベルであり、JNIを介してプラットフォームのネイティブウィジェットを使用します。SwingやAWTとはまったく関係ありません。ただし、APIはやや扱いにくく、直感的ではありません。TreeTableのようないくつかの高度なコンポーネントがあります。(しかし、私はそれらが箱から出してソートおよびフィルタリングをサポートするとは思わない)。SWTは(JNI?を介して)いくつかのネイティブバインディングを使用します。インターネット上では、このフレームワークを今日のプロジェクトで使用しないでください。(何故なの?)


SwingX

Swingに基づいており、その使命は、swing用の豊富なコンポーネントを作成することです。まだ開発中です。(ただし、あまりアクティブではありません。)たとえばTreeTableなど、非常に優れたコンポーネントのセットを用意します。しかし、TreeTableは、私の知る限り、フィルタリングとソートをサポートしていません。ただし、強調表示による検索はサポートされています。

SwingXはコンポーネント(AFAIU)であり、既存のSwingコンポーネントの拡張または構成であることに注意してください。


JGoodies

私が何も知らないフレームワーク...長所と短所は何ですか?Jgoodiesと他のセットとの違いは何ですか?

JGoodies OTOHはPLAFとレイアウトについてです。


JavaFX

Java / Oracleの最新のフラッグシップ。リッチなデスクトップまたはWebアプリケーションの開発における事実上の標準であることを約束します。


Apache Pivot

Java2Dを使用してUIをレンダリングし、SwingおよびAWTの(IMO、肥大化した)遺産の影響を最小限に抑えます。(@Augustus Thoo)

主な焦点はRIA(リッチインターネットアプリケーション)にあるようですが、デスクトップアプリケーションにも適用できるようです。そして個人的なコメントとして、とても面白そうです!私は特にそれがApacheプロジェクトであることを気に入っています。

https://cwiki.apache.org/PIVOT/frequencyly-asked-questions-faq.html


Qtジャンビ

c / c ++で書かれたネイティブqtライブラリのjavaラッパー。非常に強力で、広く使用され、受け入れられています。多くのGUIコンポーネントと使いやすいAPIがあります。

http://qt-jambi.org/


だから、私が求めていることの少しを要約しようとする:

今日、Javaで多くの高度なコンポーネントを含むデスクトップアプリケーションを作成したいとします。何を選択すればよいですか?なぜ?

これらのフレームワークのどれが非推奨として認識されるべきであり、どれが遠い未来のフレームワークとして認識されるべきですか?

今日の事実上の標準フレームワークは何ですか?Java GUIアプリケーションを作成するためにどのツールを利用しますか?


私はこれを後悔するかもしれませんが、とにかくそれを試してください:

C#/。Netには、あらゆる方向に柔軟に使用できる非常に優れた使いやすいコンポーネントのセットがあると言われています。そして、異なるJavaフレームワークをある程度調査した後、Javaについて同じことを言うことができないようです。どうしてこれなの?java(世界で最も広く使用されているプログラミング言語)に同じGUIコンポーネントのセットがないのはなぜですか?

javaがguiコンポーネントをはるかに低いレベルに基づいているだけで、探しているすべての高度なコンポーネントを作成することは可能ですが、すべての作業を自分で行う必要はありません。


SWTが「AWTとSwingの組み合わせに基づいている」ことを知りませんでした。それは本当ですか?OSのウィンドウシステムを呼び出すのは純粋なJNIだと思った...
リッチ

@リッチああ、それは回答コメントの一つで言われました。彼らが何を話しているのか知っていると思いました。
netbrain

4
「UI Toolkit」と「GUIフレームワーク」を混同していると思います。AWT、Swing、SWTはUIツールキットですが、「フレームワーク」とは呼ばないでしょう。フレームワークは特定のUIツールキットに基づいており、アプリケーションを構築するための接着剤を提供します。まず、UIツールキットを選択してから、そのツールキットで動作するフレームワークを選択する必要があります。FWIW、私は自分の自家製Guts-GUIフレームワークでSwingを選択します:-)
jfpoilpret

1
それはほとんど常にSwing対SWTです(少なくとも私にとっては)、小さな比較のために確認できます。経験豊富なJava SWTプログラマーがSwingに移行するときに知っておくべき主なことは何ですか?..
魔術師

2
JavaFXはプレビューSDKの一部ではなくなり、本番環境で使用できます。この投稿を更新してください。

回答:


79

決定木:

  1. QtやSWTなどのフレームワークには、ネイティブDLLが必要です。ですから、自問してみてください。必要なプラットフォームはすべてサポートされていますか?アプリにネイティブDLLをパッケージ化できますか?

    SWTでこれを行う方法については、こちらを参照してください

    ここで選択肢がある場合は、SWTよりもQtを優先する必要があります。QtはUIとデスクトップを理解している人々によって開発され、SWTはEclipseを高速化するために必然的に開発されました。これは、UIフレームワークよりもJava 1.4のパフォーマンスパッチです。JFaceがないと、多くの主要なUIコンポーネントやUIコンポーネントの非常に重要な機能(テーブルでのフィルタリングなど)がありません。

    SWTに必要な機能がない場合、フレームワークは拡張にいくらか敵意があります。たとえば、クラスを拡張することはできません(クラスは最終でthis.getClass()はなく、パッケージがisでない場合に例外をスローするだけorg.eclipse.swtで、署名されているため、そのパッケージに新しいクラスを追加できません)。

  2. ネイティブの純粋なJavaソリューションが必要な場合は、残りの作業を行う必要があります。AWT、Swing、SwingX-Swingの方法から始めましょう。

    AWTが古くなっています。Swingは時代遅れです(おそらく10年前にSwingで行われた作業はそれほど多くはありませんが)。Swingはそもそも良いと主張できますが、コードが腐敗していることは誰もが知っています。そして、それは今日のUIに特に当てはまります。

    これでSwingXが完成しました。ゆっくりとした進行の長い期間の後、開発は再び回復しました。Swingの主な欠点は、15年前の非常に一種の最先端であるが、今日は「不器用」に感じられる古いアイデアに留まっていることです。たとえば、テーブルビューはフィルタリングと並べ替えをサポートしていますが、これを構成する必要があります。モダンに感じられるきちんとしたUIを得るためだけに、多くのボイラープレートコードを記述する必要があります。

    もう1つの弱い領域はテーマです。今日、周りにはたくさんのテーマがあります。トップ10については、こちらをご覧ください。しかし、遅いものもあれば、バグがあるものもあれば、不完全なものもあります。UIを作成し、ユーザーが奇妙なテーマを選択したために何かがうまくいかないと不平を言うとき、私はそれを嫌います。

  3. JGoodiesは、SwingXのようなSwingの上にある別のレイヤーです。Swingをより快適に使えるようにしようとしています。ウェブサイトはすばらしく見えます。チュートリアルを見てみましょう... hm ...まだ検索しています...しばらくお待ちください。Webサイトにはドキュメントがないようです。救助へのGoogle。いいえ、役立つチュートリアルはまったくありません。

    私はドキュメントを潜在的な新しいファンから隠そうとするUIフレームワークに自信がありません。JGoodiesが悪いという意味ではありません。私はそれについて言うために何か良いことを見つけることができませんでしたが、それは見栄えがいいです。

  4. JavaFX。素晴らしい、スタイリッシュ。サポートはありますが、真剣なUIフレームワークというよりは、ピカピカのおもちゃだと感じています。この感覚は、ツリーテーブルのような複雑なUIコンポーネントの欠如に起因します。HTMLを表示するためのWebkitベースのコンポーネントがあります

    それが紹介されたとき、私は最初に「5年は遅すぎる」と思いました。あなたの目的が電話やウェブサイトのための素晴らしいアプリなら、良いです。あなたの目的がプロのデスクトップアプリケーションである場合、それが必要なものを提供することを確認してください。

  5. ピボット。初めて聞いた。基本的には、Java2Dに基づく新しいUIフレームワークです。昨日試してみました。スイングなし、AWTのほんの少し(new Font(...))。

    第一印象はいい感じでした。始めるのに役立つ広範なドキュメントがあります。ほとんどの例には、Webページにライブデモが付属しています(注:WebブラウザーでJavaを有効にする必要があります。これはセキュリティ上のリスクです)。コードと結果のアプリケーションを並べて確認できます。

    私の経験では、ドキュメントよりもコードに多くの労力を費やしています。Pivotのドキュメントを見ると、コードに多くの労力が費やされているはずです。現在、一部の例(PIVOT-858)がブラウザーで機能しないバグがあることに注意してください。

    ピボットの私の第二の印象は、それが使いやすいということです。問題が発生したとき、通常は例を見ることですばやく解決できました。ただし、各コンポーネントがサポートするすべてのスタイルの参照がありません。

    JavaFXと同様に、ツリーテーブルコンポーネント(PIVOT-306)などの一部の上位レベルのコンポーネントが欠落しています。テーブルビューで遅延読み込みを試していません。私の印象は、基になるモデルが遅延読み込みを使用している場合はそれで十分だということです。

    有望。できれば、試してみてください。


Pivotのデモ「キッチンシンク」を試しました。いくつかのグループを開いた後、CPU全体を食べ続けます。それがピボットのデザインによるものであれば、私は間違いなく自分のプロジェクトでそれを望んでいません。
表示名

私は、問題の原因を見つけたし、それはそれ以降のバージョンで修正されているように思え:apache-pivot-users.399431.n3.nabble.com/...
表示名

2
JavaFX 8(Java 8以降の場合)にはTreeTableViewウィジェットがあります。しかし、(Javaの7用)のJavaFX 2.2は、これを欠いて、また標準誤差や情報dialgosを欠い:参照stackoverflow.com/a/12760202/105137を。また、ControlsFXウィジェットライブラリはJava 8でのみ使用できます:fxexperience.com/controlsfx
kostmo

12

SWT自体はかなり低レベルであり、JNIを介してプラットフォームのネイティブウィジェットを使用します。SwingやAWTとはまったく関係ありません。EclipseのIDEおよびすべてのEclipseベースのリッチクライアントアプリケーションは、同様にVuzeはBitTorrentクライアント、SWTを使用して構築されています。また、Eclipseプラグインを開発している場合、通常はSWTを使用します。
私はEclipseベースのアプリケーションとプラグインの開発をほぼ5年続けているので、明らかに偏っています。ただし、SWTおよびJFace UIツールキットでの作業にも豊富な経験があります。その上に構築されています。JFaceは非常に豊かで強力であることがわかりました。場合によっては、それがSWTを選択する主な理由になることもあります。IDEのようなもの(テーブル、ツリー、ネイティブコントロールなど)であれば、作業中のUIをすばやく作成できます。もちろん、カスタムコントロールを統合することもできますが、これには多少の手間がかかります。


あなたの意見では、列のソートとフィルタリングを備えたTreeTableのような高度なコンポーネントは、SWT + JFaceの大きな問題でしょうか?
ネットブレイン2009

@netbrain:私は何度もやったことがありますが、JFaceを使うとかなり簡単です。これは私が「IDEのような」インターフェースによって意味したものであり、おそらく言葉の最良の選択ではありません。
ZsoltTörök11年

9

別のフレームワークを提案したいと思います:Apache Pivot http://pivot.apache.org/

私はそれを簡単にしようと、それはRIA(リッチインターネットアプリケーション)のフレームワークとして提供できるものに感銘を受けましたALAフラッシュ。

Java2Dを使用してUIをレンダリングし、SwingおよびAWTの(IMO、肥大化した)遺産の影響を最小限に抑えます。


1
ネットブレインがデスクトップアプリについて質問しているような印象を受けました。RIAフレームワークについては、GWTとVaadinも検討してください。これらのフレームワークを使用すると、Javaで記述し、すべての一般的なWebブラウザーで非常によく動作するJavaScriptをコンパイルして取得できます。
Costis Aivalis、2011

ピボットはデスクトップアプリケーションに適用できませんか?
netbrain

多分それは定義の問題ですが、RIAフレームワークは基本的にブラウザーで実行するように設計されています。
Costis Aivalis、2011

2
@netbrain:はい、Pivo​​tをデスクトップアプリ(JFrame)またはアプレット(JApplet)として実行できます。
Augustus Thoo

9

Swing + SwingX + Miglayoutは私の選択の組み合わせです。Miglayoutは、Swingが200の異なるレイアウトマネージャーを認識するよりもはるかにシンプルで、はるかに強力です。また、レイアウトを「デバッグ」する機能も提供します。これは、複雑なレイアウトを作成するときに特に便利です。


8

別のオプションはQt Jambiを使用することです。C ++の煩わしさがなく、Qtのほぼすべての優れた機能(多くのコンポーネント、優れたドキュメント、使いやすい)を備えています。3〜4年前に小さなプロジェクトで使用しましたが、それでもほぼ成熟していました。

SwingとQtの比較については、こちらをご覧ください


5

私の個人的な意見:NetBeansプラットフォームと一緒にSwingに参加します。

NetBeansプラットフォームは完全にSwingに基づいているため、(NetBeansが提供する以上の)高度なコンポーネントが必要な場合は、問題(またはJGoodies)なしでSwingXを簡単に統合できます。

基盤となるUIフレームワークに基づいて構築された優れたプラットフォームがなければ、大きなデスクトップアプリケーション(または大きくなるアプリケーション)を起動しません。

もう1つのオプションは、Eclipse RCPと組み合わせたSWTですが、そのようなアプリケーションに「純粋な」Swingコンポーネントを統合することは(不可能ではありませんが)より困難です。

学習曲線は、NetBeansプラットフォームでは少し急です(ただし、Eclipseでも同じだと思います)が、私が強くお勧めする優れた書籍がいくつかあります。


1
SwingXはコンポーネント(AFAIU)であり、既存のSwingコンポーネントの拡張または構成であることに注意してください。JGoodies OTOHはPLAFとレイアウトについてです。しかし、あなたが言ったように、どちらもSwingとシームレスに統合されます。
Andrew Thompson

1
+1 Swingに基づいて開発します。SwingはAWTの上に構築され、すべてのプラットフォームで外観と動作が同じ軽量コンポーネントが含まれているため、AWTコンポーネントを直接使用することはできません。toedter.com JCalendarのように、開発GUIに簡単に追加できる優れたBeanが多数あります。
Costis Aivalis、2011

1
@Andrewは、PLAFとレイアウトに加えて、Beanバインディング(プレゼンテーションモデルパターン用)、検証、および「JSR-296に似た」フレームワーク(1つは商用)を提供しています。
jfpoilpret 2011

3

NetBeansの組み込みSwingフレームワークとしてJSR296に基づくJavaデスクトップアプリケーションを忘れた

AWTとJavaFXを除いて、記述されているすべてのフレームワークはSwingに基づいています。Swingから始めると、これらすべてのSwing(ベースのフレームワーク)を(明確に)理解できます。

ATW、SWT(Eclipse)、Javaデスクトップアプリケーション(Netbeans)、SwingX、JGoodies

すべてのフレームワーク(JGoodiesについてもっと知りません)を含みます。JavaFXは長い間進歩していません。最新バージョンがなければ、多くのSwingベースのフレームワークが停止します。

私の見解では、SwingXが一番ですが、Swingに関する深い知識が必要です。

Swingのベースフレームワークのルックアンドフィール


それらの一部はAWTコンポーネント、一部はSwing JCompoentnsですが、AWTとSwingの間には実装されたアクセス可能なメソッドとの違いがあります。たとえば、Swing JComponentsは直接(API)AWTから多くの継承またはネストされたメソッドを直接実装します:-)
mKorbel

JSR296は死んでいます。もはや「維持」されておらず、そのサポートはNetBeansから削除されています。(そして、それを始めるのに本当に良いフレームワークになることは決してありませんでした)
a_horse_with_no_name

@a_horse_with_no_nameそのwith same progressSWT、SwingX、新しい所有者、新しいマニア
mKorbel

1
IBMによって開発されたSWTはSwingをベースにしておらず、競合するテクノロジーでした。SwingはAWTを使用します。JavaFXはSwingにも基づいていません。まったく新しいフレームワークです。Swingの後継者と呼ぶ人もいますが、その戦いを呼ぶにはまだ時期尚早です。私は現時点でまったく同じ決定を行っており、Swingは私の候補です。これは、最も成熟しているが、現実的なオプションであるためです。
ゴードン

1
SwingXはSwingの拡張機能です(そのため、Swingの知識が必要です)。実際、SwingXの機能の一部はSwing自体に組み込まれています。
ゴードン

3

私が関わってきたデスクトップアプリケーションについて、Swingに非常に満足しています。しかし、Swingが高度なコンポーネントを提供していないという見方を共有します。これらのケースで私がやったことは、JIDEに行くことです。それは無料ではありませんが、それほど高価でもありませんし、あなたのベルトの下であなたにずっと多くのツールを提供します。具体的には、フィルター可能なTreeTableを提供します。


知っておきたい!したがって、JIDEはSwingに基づいて独自のコンポーネントを作成しました...
netbrain

はい、JIDEはグリッド、ツリー、テーブル、グラフなどをカバーするかなりの数のコンポーネントを作成しました。私が言ったように、それは無料ではありませんが、自分でこれらのものを自分で作るのにかかる時間を考えると、おそらくすでに作られたものを使う方がいいでしょう。さらに、私が理解している限り、JIDEは、オープンソースプロジェクトがコンポーネントのWebサイトへのリンクまたは「About」ダイアログのロゴと引き換えにコンポーネントを使用できるようにすることに関して柔軟です。
sbrattla 09/10/11

3

Swingで行きます。レイアウトには、JGoodiesフォームレイアウトを使用します。フォームレイアウトに関するホワイトペーパーをここで学ぶ価値はあります-http ://www.jgoodies.com/freeware/forms/

また、巨大なデスクトップアプリケーションの開発を開始する場合は、必ずフレームワークが必要です。他の人たちは、netbeansフレームワークを指摘しました。私はそれがあまり好きではなかったので、私が今会社で使用している新しいものを書きました。私はそれをsourceforgeに載せましたが、それを文書化する時間はあまりありませんでした。コードを参照するためのリンクは次のとおりです。

http://swingobj.svn.sourceforge.net/viewvc/swingobj/

ショーケースには、実際に簡単なログオンを行う方法が示されているはずです。

ご不明な点がございましたら、お気軽にお問い合わせください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.