いまさらSwing (1)
Java = サーバーサイド というのが定着してしまい、Swingを使用したクライアントアプリというのは、開発者向けを除くとごくわずかです。ですが、最近ではJavaFXのリリースなどJavaリッチクライアントもにわかに盛り上がりつつあります(かねぇ・・・?)。
というわけで、Swingを使用したクライアントアプリケーションについて記事を書いてみたいと思います。
Swingは遅い?
Javaは当初アプレットでの利用も比較的多く、今でも社内システムの一部がアプレットで出来ていてその遅さにイライラしている方も少なくないかと思います(SwingでなくAWTが多いと思います)。そのせいかJava=遅い(重い)。高性能なサーバー用の言語というイメージが定着してしまったような気がします。
Javaの生みの親Sun Microsystemsの動きとしては、昨年の12月にJavaFX 1.0をリリースするなどクライアントサイドにも力を入れてきています。JavaFXに合わせてかJRE6update10(現在の最新はupdate11)以降Java2Dの性能向上なども行われており、通常のSwingアプリもその恩恵を受けることができます。
最近のPCで最新のJREを使用すれば、Javaの速度に不満が出ることはほとんど無いと思います。今後、Swingを使用したクライアントアプリケーションを積極的に使ってみてもよいのではないでしょうか。
Swingの基本
それでは、Swingの基本的な使い方についておさらいします。サンプルとして簡単なボタンを持つ、ウィンドウを作成してみます。
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; public class ImasaraSwing1 { private static void createAndShowGUI() { final JFrame frame = new JFrame("いまさらSwing1"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JButton button = new JButton("Hello"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(frame, "Hello Swing!!"); } }); frame.add(button); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } }
JFrame(ウィンドウ部品)にJButton(ボタン部品)をaddすることで、ボタン一個だけのウィンドウを作成しています。また、ボタンにはアクションリスナーと呼ばれるボタンを押された時に発生するアクションイベントを処理するリスナーを追加しています。
Swingを勉強したことのある方からすると、”昔”のやり方と少し違うことに気がつくかもしれません。
まず、createAndShowGUI()メソッド中でframe.add()メソッドでbuttonコンポーネントを追加しています。Java1.4までは、frame.getContentPane()でコンテントペインを取得し、コンテントペインに対してadd()する必要がありました。Java5以降は、直接addすることができるようになりました。
次に、main()メソッドからcreateAndShowGUI()メソッドを呼び出す際、SwingUtilities.invokeLaterを使用してEDT(EDTは次回説明します)上で実行されるようにしています。古い書籍やインターネット上のサンプルでは、メインスレッド上でコンポーネントの初期化を行っていますが、コンポーネントの初期化はスレッドセーフではないのでEDT上で初期化するように変更になっています(Sunのサンプルもそうなっています)。とりあえず今は、コンポーネント初期化でのinvokeLaterは”おまじない”だと思っておいてもよいです。
次回予告
次回、EDTについておさらいしてみたいと思います。
参考にしたもの
TrackBack URL :
