Javaの最新技術に触れてみる
2006年12月にJava SE 6(Mustang)が正式リリースされました。この最新版のJDKに含まれる拡張機能を利用して、簡単なアプリケーションをつくります。
サンマイクロシステムズ社より2006年12月に Java の最新版である Java SE 6(Mustang)が正式リリースされました。Java の最新の JDK を使用して、デスクトップに付箋を表示しメモ書きができるアプリケーションを作成してみます。
Java SE 6の新機能
Java SE 6 の新機能と拡張機能については、以下のものが挙げられます。
- 1.クラスファイル仕様の刷新
- JVM の不可を減らすための情報が追加された。
- 2.コンパイラAPI/アノテーションプロセッサ
- Java プログラム内から javac/apt へアクセスを可能にした。
- 3.スクリプト言語のサポート
- 各スクリプト言語を共通のインターフェースから呼び出せるようにした。
- 4.JDBC 4.0
- コーディングの簡略化とデータ型の拡張が行なわれている。
- 5.XMLストリーミング
- XMLデータを読み書きするのに用いる API、StAX(Streaming API for XML)が追加された。
- 6.JAXB 2.0
- スキーマレスな Java/XMLバインディングが実現されている。
- 7.JAX-WS 2.0
- JAX-WS は、大幅な改善を施した JAX-RPC(Java API for XML based PRC)と言うべきもので、Webサービスを公開/利用するための機能であるが、よりWebサービスクライアントの開発が容易になっている。
- 8.JVMの進化
- パフォーマンス改善をもたらす隠れた新機能が追加された。
- 9.コアライブラリの拡充
- データ構造の追加やファイル管理機能の向上などが行なわれている。
- 10.管理/監視機能の強化
- リソース情報の取得や公開が容易に行なえるようになった。
- 11.デスクトップAPIの拡張
- スプラッシュスクリーンやシステムトレイへの対応が行なわれている。
Java SE 6 では、デスクトップアプリケーションの開発に関係するAPIも拡張された。
Java SE 6 で追加・拡張された機能について、詳しくはサンマイクロシステムズ社のサイトをご覧下さい。Java SE 6新機能と拡張機能
付箋アプリケーションを作成する
今回作成するアプリケーションの内容として、「デスクトップAPIの拡張」を使用し、以下のような要件を満たすものを考えてみました。
- アプリケーションを実行するとシステムトレイにアイコンが追加され、駐屯する
- システムトレイのアイコンを右クリックすると、付箋を追加するメニューとアプリケーションを終了するメニューが表示される
- 表示された付箋上で右クリックすると、付箋を消すメニューが表示される
- 表示された付箋をドラックできる
Javaからシステムトレイにアクセスする
システムトレイは Windows のデスクトップの右下にある小さいアイコンが表示される領域です。今回作成するアプリケーションは、システムトレイをサポートしているプラットフォームでのみ使用可能なアプリケーションとなります。
Java でシステムトレイを表すクラスは java.awt.SystemTray です。システムトレイに表示するアイコンは java.awt.TrayIcon を使用します。
TrayIcon trayIcon = new TrayIcon( ImageIO.read( new File( "JavaCup.gif" ) ) );
tray.add( trayIcon );
リスト1
SystemTray オブジェクトはシングルトンですので、SystemTray#getSystemTray メソッドで取得することができます。ここで取得した SystemTray に、生成したTrayIcon インスタンスを SystemTray#add メソッドで追加することができます。
リスト1は TrayIcon のコンストラクタの中で最も簡単な、java.awt.Image オブジェクトだけを引数にもつコンストラクタを使用しています。![]()
このソースコードを実行すると、右のようにシステムトレイに指定したアイコンが表示されます。
![]()
TrayIcon にツールチップを表示させたい場合は、リスト2のようにコンストラクタの第2引数にString型のオブジェクトを渡します。
ImageIO.read( new File( "JavaCup.gif" ) ), "システムトレイサンプル" );
リスト2
TrayIconへのポップアップメニューを追加する
TrayIcon にポップアップメニューを追加することもできます。TrayIcon のコンストラクタの第3引数に java.awt.Popupmenu オブジェクトを渡すことで PopupMenu を使用できます。(リスト3)
MenuItem item1 = new MenuItem( "Menu1" );
MenuItem item2 = new MenuItem( "Menu2" );
menu.add( item1 );
menu.add( item2 );
TrayIcon trayIcon = new TrayIcon(
ImageIO.read( new File( "JavaCup.gif" ) ), "システムトレイサンプル", menu );
リスト3
リスト4では、TrayIcon オブジェクトを生成するときに表示するアイコンとツールチップ、付箋を追加するメニューとアプリケーションを終了するポップアップメニューを引数にセットしています。
ImageIO.read( new File( "JavaCup.gif" ) ), "付箋アプリケーション", createPopupMenu() );
protected PopupMenu createPopupMenu() {
PopupMenu menu = new PopupMenu();
MenuItem item1 = new MenuItem( "終了" );
item1.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
System.exit( 0 );
}
} );
MenuItem item2 = new MenuItem( "付箋を追加" );
item2.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
MemoTagSample tag = new MemoTagSample();
tag.showTag();
}
} );
menu.add( item1 );
menu.add( item2 );
return menu;
}
リスト4
付箋へポップアップメニューを追加する
付箋を消すポップアップメニューを追加するために、 java.awt.event.MouseListener を実装しています。 MouseLister#mousePressed メソッドと MouseListener#mouseReleased メソッドに対し、マウスが右クリックされた時にポップアップメニューを表示するように実装しています。MouseEvent がポップアップメニューを表示させるイベントかどうかを判定するために、MouseEvent#isPopupTrigger メソッドを使用しています。
protected void createPopupMenu() {
menu = new JPopupMenu();
JMenuItem item1 = new JMenuItem( "消去" );
item1.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
frame.dispose();
}
} );
menu.add( item1 );
}
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
menu.show( e.getComponent(), e.getX(), e.getY() );
}
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
menu.show( e.getComponent(), e.getX(), e.getY() );
}
}
リスト5
ポップアップメニューのトリガはシステムによって異なります。したがって、共通プラットフォームを適切に機能させるために、mousePressed および mouseReleased の両方で isPopupTrigger をチェックする必要があります。
付箋をドラッグできるようにする
付箋をドラッグできるようにするために、java.awt.event.MouseListener とjava.awt.event.MouseMotionListener を実装しています。MouseListener#mousePressed でマウスがクリックされたときのイベントを取得します。取得したイベントから MouseMotionListener#mouseDragged メソッド内でx位置とy位置を取得し、付箋のロケーションにセットしています。
public void mousePressed(MouseEvent e) {
press = e;
}
public void mouseDragged(MouseEvent e) {
Point point = frame.getLocation();
int x = point.x - press.getX() + e.getX();
int y = point.y - press.getY() + e.getY();
frame.setLocation(x, y);
}
リスト6
付箋の見栄えを調整する
付箋として使用するGUIは、javax.swing.JFrame と javax.swing.JTextArea を用いて実現しています。内容としては JFrame に JTextArea を add したのみの簡単なものですが、リスト7ではより付箋っぽくするために、JFrame のタイトル部分(×ボタンや最大化・最小化ボタンがある部分)の表示をなくしています。リスト4の用に JFrame#setUndecorated メソッドで表示を行なわないようにしています。
frame.setUndecorated( true );
リスト7
Dimension sc = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation( (sc.width - frame.getWidth()) / 2, (sc.height - frame.getHeight()) / 3 );
frame.setVisible( true );
}
リスト8

付箋を表示する時は画面の中央に表示したいので、表示するメソッドの中でリスト8のように記述しています。java.awt.ToolKit からスクリーンサイズを取得し、中央位置を算出しています。
リスト4~リスト8のソースを含んだプログラムを実行すと右のようになります。
※上記リンクからダウンロードできるzipファイルにはサンプルで使用している JavaCup.gif ファイルも含まれています。
おわりに
今回作成したアプリケーションは、付箋のリサイズができないことやフォントが変更できないこと、付箋の背景色が変更できないこと…など色々不便な点があります。それらは後々改善していくつもりですが、このコラムをご覧になり、興味をもたれた方は自分流にカスタマイズしてみてはいかがでしょうか。
Java の最新のSDKを使用して簡単なアプリケーションを作成しようという目的で、今回のコラムを書かせてもらいましたが、Java には他にも様々な機能があります。J2SE 5.0 から追加されたアノテーションやジェネリシスなど...まだまだ私自身も触れたことのないような機能が追加されています。それらの機能についても調査・研究をすすめていくことで、よりよいアプリケーションを作成し、お客様に満足して頂けるように努めていきたいと思います。
ダウンロード
| 添付ファイル | サイズ |
|---|---|
| 04jdk_src.zip | 3.32 KB |

