株式会社八角研究所 > 【連載】いまさらSwing - 第1回 Swingの基本

エンジニア募集中!

独立心旺盛で、新しい技術で新しいWebサービスを作りたいと思っているけれど、ひとりでやることに限界を感じているフリーのエンジニアの方。あなたの期待にこたえられる仲間と環境を、八角研究所なら提供できると思います。社員としてではない関わり方も、あるかもしれません。

2009年02月17日 19:52

いまさらSwing
第1回 Swingの基本 * * * *

by tunakan

Tags: Java 気になる技術をメモりたい Swing

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の基本的な使い方についておさらいします。サンプルとして簡単なボタンを持つ、ウィンドウを作成してみます。

サンプルコード1

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についておさらいしてみたいと思います。

参考にしたもの

この記事の執筆者

九州男児 tunakan 28歳 入社2年目

内臓が全般的に弱いです。データベースは苦手なのに変なデーターベースに当たることが多い気がします。

この人の会社をみる この人関連のイベントをさがす この人と一緒にはたらく

この日記にコメントする

(メールアドレスは公開されません。メールで返答が欲しい場合などに入力してください)

このエントリへのトラックバックURL

コメント

コメントはありません

トラックバック

トラックバックはありません

メンバー紹介

boy

boy

少年です。 18歳以下(嘘)でも立派に社員です。 よろしくおねがいします。

sugimaru

sugimaru

すぎまるです。22時のシンデレラです。

はち子さん

はち子

広報を担当している、はち子です。本当は広報じゃなくて事務デスが、広報って言うほうがかっこいいし! 社内でゆいいつ、...