【コラム】

Java API、使ってますか?

7 Swing開発の救世主となるか - Swing Application Framework

杉山貴章  [2007/03/26]

7/60

JSR 296: Swing Application Frameworkとは

SwingはJavaでGUIアプリケーションを作成するための豊富な機能とコンポーネントを提供してくれるツールキットである。しかしその豊富な機能ゆえに簡単なアプリケーションでも記述しなければならないコードが多く、開発者を混乱させる要因になっている。

Swing Application Frameworkはそのような開発者の悩みを解決し、もっと手軽にSwingを利用できるようにするという目的で提案された。このフレームワークでは、Swingアプリケーションを開発する上で開発者が陥りがちな間違いや混乱しやすい部分、実装が複雑になりやすい部分などを洗い出し、それらに対する統一的でシンプルな解決策を提供する。

具体的な内容は現在検討されている最中だが、後述するプロトタイプ版では次のような機能が提供されている。

  • GUIアプリケーションのライフサイクル管理をサポートする
  • リソースの読み込みと管理をサポートする
  • (非同期アクションを含む)アクションの定義や管理、バインディングをサポートする
  • セッション状態の永続化をサポートする

デスクトップアプリケーション開発環境の増強はJava SE 7におけるメインテーマのひとつでもある。Swing Application Frameworkはそれを実現するための最も有力なAPIと言える。以下ではこのフレームワークのプロトタイプ版を用いて、その使用例を紹介したい。

Swing Application Frameworkの使用例

Swing Application Frameworkはプロトタイプ版がjava.net内のプロジェクトサイトにて公開されている。まだJSR 296の仕様が確定していないため今後大きな変更が加えられる可能性もあるが、このフレームワークがどのような機能を提供してくれるかを見るには十分の完成度だ。

プロジェクトのトップページからはソースパッケージとAPIドキュメントの最新版(本稿執筆時点ではバージョン0.21)をダウンロードすることができる。ソースパッケージはNetBeansのプロジェクト形式になっているため、NetBeansを使用すれば簡単にビルドすることが可能だ。ビルドに成功すると「AppFramework.jar」というファイルが生成される。

その他、ドキュメントセクションからは過去のバージョンやビルド済みのJARファイルをダウンロードすることができる。

Swing Application Frameworkを使用するには、AppFramework.jar(ビルド済みの配布ファイルの場合は AppFramework-xxx.jar)と、ソース・パッケージのlibディレクトリに含まれているswing-worker.jarをクラスパスに含めてコンパイル/実行すればよい。

Swing Application Frameworkの最も基本的な使い方は、application.Applicationクラスやそのサブクラスを継承し、それを元にGUIアプリケーションを構築していく方法だ。application.ApplicationクラスはSwingアプリケーションを作成するための基底クラスとなっており、GUIを構築するための標準的な方法を提供している。例えば起動時に呼び出されるstartup()や終了時に呼び出されるshutdown()などのメソッドが用意されており、GUIの初期化や終了処理はこれらをオーバーライドして記述すればよい。

リスト1はApplicationのサブクラスであるapplication.SingleFrameApplicationクラスを利用してGUIアプリケーションを作成した例だ。SingleFrameApplicationクラスは1つのJFrameのみで構成されるGUIアプリケーションを作成するための機能を提供する。ここではstartup()メソッドをオーバーライドしてGUIの構築を行っている。

リスト1 MyApplication.java - Swing Application Frameworkの使用例

package sample;

import application.SingleFrameApplication;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyApplication extends SingleFrameApplication {
    private JLabel label = null;

    @Override
    protected void startup(String[] args) {
        JPanel panel = new JPanel(new BorderLayout());
        
        label = new JLabel();
        label.setName("label");
        JButton button = new JButton();
        button.setName("button");
        button.setAction(new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                label.setText(e.getActionCommand() + " is clicked.");
            }
        });
  
        panel.add(label, BorderLayout.CENTER);
        panel.add(button, BorderLayout.SOUTH);
        show(panel);
    }
    
    public static void main(String[] args) {
        launch(MyApplication.class, args);
    }
}

startup()の中身は、基本的には通常のSwingアプリケーションと同様にGUIコンポーネントを構築し、最後にshow()メソッドにそれを渡せばウィンドウ表示に反映される。実行はlaunch()メソッドにこのクラスのClassオブジェクトと実行時引数を渡せばよい。

また、この例ではSwing Application Frameworkの持つリソースのインジェクション機能を利用している。まず、各コンポーネントにsetName()メソッドで識別子を指定しておく。そしてこのクラスの所属するsampleパッケージのサブパッケージとしてsample.reoureceパッケージを作成し、そこにMyApplication.propertiesというプロパティファイルを用意する。このプロパティファイルにリスト2.2のように各コンポーネントのプロパティを指定しておけば、それが自動的にアプリケーションに反映される。

リスト2 MyApplicationのためのプロパティファイル

mainFrame.title = SingleFrameApplication Sample
label.text = Please push button!
label.font = Serif-PLAIN-24
button.text = Button
button.font = Monospaced-BOLD-16

通常、コンポーネントへのリソースのインジェクションはapplication.ResourceMapクラスを利用して行うが、SingleFrameApplicationクラスはデフォルトでその処理を行ってくれるようになっている。

このプログラムを実行すると図1、図2のようになる。

図1 MyApplicationの実行例

図2 ボタン押下後

実行時のファイルの配置は図3のようにする。

図3 実行時のファイルの配置

上の例ではリスナを使用してボタン押下時の処理を定義したが、Swing Application Frameworkでは@Actionアノテーションを利用することでActionイベントを処理することもできる。具体的にはリスト3のようにして@Actionを指定したメソッドを用意する。それをappilcation.ApplicationContextクラス、appilcation.ActionMapクラスを利用してボタンにセットすれば、ボタン押下時にそのメソッドが呼び出されるようになる。

リスト3 MyApplication2.java - Swing Application Frameworkの使用例2

package sample;

import application.Action;
import application.ApplicationContext;
import application.SingleFrameApplication;
import javax.swing.ActionMap;
import javax.swing.JButton;
import javax.swing.JOptionPane;


public class MyApplication2 extends SingleFrameApplication{
    
    @Override
    protected void startup(String[] args) {
        JButton button = new JButton();
        button.setName("button");
        ApplicationContext context = ApplicationContext.getInstance();
        ActionMap actionMap = context.getActionMap();
        button.setAction(actionMap.get("showDialog"));
  
        show(button);
    }
    
    @Action 
    public void showDialog() {
        JOptionPane.showMessageDialog(getMainFrame(), 
                "Button clicked!", "Message", JOptionPane.INFORMATION_MESSAGE);
    }

    public static void main(String[] args) {
        launch(MyApplication2.class, args);
    }    
}
package sample;

import application.Action;
import application.ApplicationContext;
import application.SingleFrameApplication;
import javax.swing.ActionMap;
import javax.swing.JButton;
import javax.swing.JOptionPane;

public class MyApplication2 extends SingleFrameApplication{
    
    @Override
    protected void startup(String[] args) {
        JButton button = new JButton();
        button.setName("button");
        ApplicationContext context = ApplicationContext.getInstance();
        ActionMap actionMap = context.getActionMap();
        button.setAction(actionMap.get("showDialog"));
  
        show(button);
    }
    
    @Action 
    public void showDialog() {
        JOptionPane.showMessageDialog(getMainFrame(), 
                "Button clicked!", "Message", JOptionPane.INFORMATION_MESSAGE);
    }

    public static void main(String[] args) {
        launch(MyApplication2.class, args);
    }    
}

リスト4 MyApplication2のためのプロパティファイル

mainFrame.title = SingleFrameApplication Sample
button.text = Push!
button.font = Monospaced-BOLD-16
showDialog.Action.text = &Execute
showDialog.Action.shortDescription = show message dialog

このプログラムを実行すると図4、図5のようになる。

図4 MyApplication2の実行例

図5 ボタン押下後

実行時のファイルの配置は図6のようにする。

図6 実行時のファイルの配置

Swing Application Frameworkにはほかにもさまざまな使い方がある。java.netのサイトにいくつかのサンプルが掲載されているので、それらを参考にしていろいろ試してみるといいだろう。

NetBeansとJSR 295/JSR 296

さて、Swing Application Frameworkは先週紹介したJSR 295: Beans Bindingなどと組み合わせることで、さらに強力なフレームワークになるだろうと期待されている。さらに、次期バージョンのNetBeansではこれらのAPIをサポートする予定となっている。

開発者の一人であるRouman Strobl氏のブログには、開発中のNetBeans 6とJSR 295、JSR296を利用して作られたサンプルアプリケーションのデモが公開されている。これを見ると、これらのAPIがSwing開発者にとって非常に強力な武器になることがよくわかるだろう。

提供:毎日就職ナビ

会員登録はこちら

学生のための就職情報サイト「毎日就職ナビ」。6,000社以上の新卒採用情報が常時掲載され、社内の雰囲気が伝わる情報画面、さまざまな項目での会社検索、エントリーや説明会検索など、機能も充実。無料適職診断、就活Q & A、エントリーシート添削講座など、就職活動に役立つ記事も満載です。研究者、エンジニアを目指す学生の方々も是非エントリーしてください。お待ちしています!

毎日コミュニケーションズはプライバシーマークを取得しています。

7/60

インデックス

連載目次
第60回 どうなる? 今後のJavaプラットフォーム(Java SE編)
第59回 どうなる? 今後のJavaプラットフォーム(Java EE編)
第58回 Java SE 7の要注目機能"クロージャ"はどうなるのか その6
第57回 Java SE 7の要注目機能"クロージャ"はどうなるのか その5
第56回 Java SE 7の要注目機能"クロージャ"はどうなるのか その4
第55回 Java SE 7の要注目機能"クロージャ"はどうなるのか その3
第54回 Java SE 7の要注目機能"クロージャ"はどうなるのか その2
第53回 Java SE 7の要注目機能"クロージャ"はどうなるのか
第52回 Early Draftが公開されたJSF 2.0
第51回 EJBから独立したJava Persistence 2.0
第50回 モバイルJavaの新しい潮流となるか - MSA 2.0のドラフト公開
第49回 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む
第48回 JOGLで3Dプログラミング その4
第47回 JOGLで3Dプログラミング その3
第46回 JOGLで3Dプログラミング その2
第45回 JOGLで3Dプログラミング
第44回 JARファイルを効率的にネットワーク転送するためのPack200形式
第43回 Early Draftで把握するEJB 3.1の新機能
第42回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その2
第41回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その1
第40回 リソースアダプタによる接続の仕組み
第39回 JCAを利用したシステム間接続
第38回 Java EEと外部システムの接続性を支えるJCAがバージョンアップ
第37回 Javaのモジュラリティ強化を担う"スーパーパッケージ"とは
第36回 JSR 308対応のコンパイラを試す
第35回 公開されたJSR 308のEarly Draftを検証する
第34回 スクリプト言語とJavaを結びつけるJSR 223
第33回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2
第32回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その1
第31回 Javaの文法がそのまま使えるスクリプト言語"BeanShell"
第30回 Javaアプリケーションにオブジェクトのキャッシュ機構を提供するJCache API
第29回 Javaアプリケーションからのリソース管理を可能にするJSR 284
第28回 XMLデータソースへの問い合わせはJSR 225で
第27回 Portlet Specification 2.0をもっと手軽に利用する
第26回 次期Javaポートレット仕様となるJSR 286
第25回 JSFとポートレットをつなげるJSR 301
第24回 Webサービス向けのポートレット仕様「WSRP」
第23回 高い相互運用性を実現するポートレットAPI - JSR 168
第22回 Java EE環境でタスクのスケジューリングを可能にするJSR 236
第21回 Java EE環境でのスレッドプログラミングを可能にするJSR 237
第20回 音声認識/合成のためのAPI - Java Speech APIとJSR 113
第19回 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入
第18回 JAX-RSで簡単RESTful - JSR 311
第17回 待望のServlet 3.0がJSRに登場 - JSR 315
第16回 アノテーションを使ってバグ退治 - JSR 305
第15回 アノテーションをさらに広い範囲で利用可能にするJSR 308
第14回 Webアプリケーション開発の要となるか - JSF 2.0がJSRに登場
第13回 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262
第12回 Javaアプリケーションのモジュール化をサポートするJava Module System
第11回 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform
第10回 JSR 295: Beans Bindingの参照実装を試す
第9回 けっこう便利! 単位を扱うAPI -- JSR 275: Units Specification
第8回 アノテーションでバリデーション - JSR 303: Bean Validator
第7回 Swing開発の救世主となるか - Swing Application Framework
第6回 JavaBeansのプロパティを同期させるバインディングAPI
第5回 誰よりも早く"Java SE 7"を睨む
第4回 日時情報の取り扱いを改善する JSR 310: Date and Time API
第3回 古いAPIも進化している!? - JSR 919: JavaMail 1.4
第2回 JSR 1 リアルタイムJava仕様
第1回 JCPによって進められるJava関連技術の標準化

もっと見る



IT製品 "比較/検討" 情報

転職ノウハウ

あなたが本領発揮できる仕事を診断
あなたの仕事適性診断

シゴト性格・弱点が20の質問でサクッと分かる!

「仕事辞めたい……」その理由は?
「仕事辞めたい……」その理由は?

71%の人が仕事を辞めたいと思った経験あり。その理由と対処法は?

3年後の年収どうなる? 年収予報
3年後の年収どうなる? 年収予報

今の年収は適正? 3年後は? あなたの年収をデータに基づき予報します。

激務な職場を辞めたいが、美女が邪魔して辞められない
激務な職場を辞めたいが、美女が邪魔して辞められない

美人上司と可愛い過ぎる後輩に挟まれるエンジニアの悩み

人気記事

一覧

イチオシ記事

新着記事

『魔法つかいプリキュア!』3人目のプリキュア発表、はーちゃんが急激に成長
[05:00 6/1] ホビー
[おそ松さん]DVD5巻がオリコン首位 2作連続首位で「To Heart」「ラブひな」に並ぶ
[04:00 6/1] ホビー
[ガルパン]劇場版BDが自己最高の16.2万枚でオリコン首位 邦画アニメ歴代4位
[04:00 6/1] ホビー
【レポート】COMPUTEX TAIPEI 2016 - ASUS初のロボット「Zenbo」をブースで見てきたぞ! 写真と動画で各部を紹介
[00:01 6/1] パソコン
「鉄腕アトム」誕生物語がアニメ化!ゆうきまさみ×カサハラテツロー描く新説
[00:00 6/1] ホビー

求人情報