プロが教える店舗&オフィスのセキュリティ対策術

Java初心者ですが、質問させてください。

SWTとSwingという二つのGUIを作るための手法(?)があるのを学習しました。そこで「SWTがOSネイティブのAPIを呼び出す」「Eclipse自体がSWTで組まれてる」「Swingより高速」「でも、SwingもPC環境の向上などで早い」などとどこかに書いてあった気がするのですが、疑問があります。

・SwingでのGUIというのは、なんていうか、何年ぐらい前と具体的には言えないのですが、昔のJavaアプリっぽい、『浮いた感じ』のGUIになるのでしょうか。「Cabos」のGUIがちょうど、その「浮いた感じ」に相当するんですか?

・逆に、Eclipseで見られるように、Windows付属ソフトのようなメニューバーを持つ(マウスカーソルを合わせたときの色の変化や、選択したときのポップアップの仕方なども含め)ソフトで、Javaで作成されたものというのが、SWTで作られたソフトということでしょうか?

・Javaの特性と、SWTの特性を合わせて、「OSネイティブのAPIを呼び出すのにもかかわらず、同じ実行ファイルで、Windows・Mac両方ともで実行できるソフト」というのを作れるということでしょうか?

・Swing=「Cabosのような、あの浮いた感じ」ではあるのもの、高速化が十分なされているということですが、実際のところどうなのでしょうか。何か速度差の具体例があれば教えていただきたいのですが・・。何か「たとえ話」でもかまいません。


以上駄文で読みにくいかと思いますが、回答の程よろしくお願いします。

A 回答 (3件)

正確には3つの選択肢と考えたほうがよいですね。

AWT、Swing、SWTでしょう。本当のことを言えば、「AWTとSwing」の2つで、後は「その他にも、SWTなんかがある」という感じなのですが・・・。

まず、両者の最大の違いは、「標準か否か」という点でしょう。Swingは、Javaの標準ライブラリに含まれているものです。つまり、すべてのJavaプログラムで使えますし、作成したプログラムは(Java仮想マシンさえ入っていれば)どのOSでも動きます。

一方、SWTは、Eclipse Foundationという一団体が作って配布しているオープンソースのプログラムです。したがって、これを利用したプログラムは、それだけでは動きません(Javaの標準機能にないものなので)。あわせて、これを動かすためのDLLなどをつけて配らないと動かないのです。また、これはネイティブなコードですから、OSごとに異なるファイルを配布しないといけません。つまりSWTを利用した場合、「Windows用の配布ファイル」はMacやLinuxでは動かないことになります。

第2の違いは、「ネイティブコードによる実装か否か」という点でしょう。SWTの最大の長所は、ネイティブコードによって実行されるため高速でしかもOS固有のGUIが正確に再現できる、という点です。

Swingの場合、確かにSWTに比べるともったり感はあります。が、相当に複雑なインターフェイスならば別ですが、ちょっとしたアプリケーション程度なら、今のマシンではあまり気にならないと思いますよ。また、GUIに関しても、Java5、6とかなり修正されており、現在の最新のJavaならば、VistaでもVista風のGUIできちんと表示されます。確かに微妙に違っているところはありますが、いわれないと気づかない程度にはそっくりに作れます。昔はいざしらず、今ではちゃんと作れば「Swingかどうか」なんてほとんどわかりませんよ。

第3点の違い、それは「実装の貧弱さと拡張性」でしょう。SWTは、はっきりいって貧弱です。またネイティブコードを直接たたいているため、拡張性に乏しい欠点があります。それと、Javaにネイティブな実装を持ち込んでいる関係で、Javaの一般的なコーディングとはかなり違う、特殊なコーディングを強いられるところがあります。正直いって、かなりやりにくいです。

Swingは非常に柔軟です。また標準で用意されている機能も豊富で、やりようによってはどんなものでも作れるでしょう。ただし、その分、マスターするのは大変ですが。

いろいろと特徴はありますが、どちらにも共通していえることが1つあります。「どっちにしろ、AWTをマスターしてない人には使いこなせない」という点です(笑)。Java初心者ということですから、まずはAWTをマスターするのが先決でしょう。次に、Swingの基礎。これらがマスターできて、初めてSWTという選択肢が出てきます。これらもわからない人間に、SWTは使いこなせません。

というわけで、どちらがいいかではなく、「AWT→Swing」が基本。その上で、更にやってみたいなら「SWT」という選択肢もある、と考えたほうがよいと思いますよ。
    • good
    • 4

AWTかSwingを使ったプログラムでは、


作成したクラスの入ったJARファイルがあれば、
WindowsでもMacでもUnixでも動きます。
これは、JARファイルには「Windows用」とか「Mac用」などの
区別がないからです。

しかし、SWTを使ったプログラムでは、作成したJARファイルのほかに
「swt-awt-win32-3064.dll」等のファイルが必要です。
これは名前にwin32が含まれているように、Windows用です。
Macで同じプログラムを動かすには、Mac用のDLLを用意しなければなりません。
ただ、SWTはWindows、Macをはじめとして主要なOSをほとんどサポートしていますし、JARファイルのほうはどのOSでも同じファイルで動きますので、あまりデメリットにはなりません。

私は自作のツール類(ファイル名を一括置換させたり、FTPを自動化するツールなど)をJava+SWTで作成しているのですが、そもそもWindowsでしか使わないので、SWTでまったく問題ありません。

また、Swingの「浮いた感じ」の見た目ですが、たしかJava1.4だか5.0で改善されているのではないでしたっけ?Swingはあまり使っていないので自信ないのですが・・・
    • good
    • 1

> SwingでのGUIというのは、なんていうか、(以下略)



多分そのとおり。
Swingは環境間で概観を統一するために、Windows標準からみるとある意味浮いているとうか、
個人的な表現では「べたっとした感じ」になります。(特に昔のものは顕著)

> 逆に、Eclipseで見られるように、(以下略)

多分そのとおり。それがSWTの売りです。

> Javaの特性と、SWTの特性を合わせて、(以下略)

アプリ自体は特殊なこと/依存したことをしてなければ共通で動くはずですが、
OS毎に別のSWTを用意するなどが必要です。

> Swing=「Cabosのような、あの浮いた感じ」ではあるのもの、(以下略)

速度差もそうですが、Swingで一度描画の同期がずれると
画面全体がうまく再描画されなくなることがあって、見た目にかなり格好悪い印象。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!