じゃじゃ馬ならし

 

ネイティブアプリにアクセス - Desktop

アプリの連携がやりにくくありませんでしたか

Java で他のアプリケーションを起動するには、ProcessBuilder クラスを使用しますよね。これはこれでいいのですが、起動するアプリケーションが分からないときがあります。

たとえば、ブラウザ。

たぶん、ブラウザがあることは分かるんだけど IE なのか Firefox なのか Opera なのか、Java のアプリケーションからだとなかなか分からないんですよね。JNI を使えばできるのですが、それはちょっと...

また、普通は MIME タイプごとに起動するアプリケーションが決まっていますが、そのアプリケーションが何かを知りたいわけです。

でも、もうそんな悩みも過去のこと。Java SE 6 を使えば、あっという間にできるのです。

 

ブラウザを起動する

それをやるためのクラスが java.awt.Desktop クラスです。

使い方はとても簡単です。

サンプルのソースコード DesktopSample1.java

 

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
 
public class DesktopSample1 {
    public DesktopSample1() throws URISyntaxException, IOException {
        Desktop desktop = Desktop.getDesktop();
 
        desktop.browse(new URI("http://google.co.jp"));
    }
 
    public static void main(String[] args) {
        try {
            new DesktopSample1();
        } catch (URISyntaxException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

 

Desktop オブジェクトはファクトリメソッドである Desktop#getDesktop メソッドで取得できます。

後はブラウザを起動するのであれば、browse メソッドをコールするだけです。引数は URI オブジェクトです。

実行すると、単にブラウザが起動し、Google の Web ページが表示されました。

なんて簡単なんでしょう。

ただし、これができないプラットフォームもあります。

そんなときには、まず Desktop#isDesktopSupported メソッドと Desktop#isSupported メソッドで可能かどうかチェックしてみましょう。

 

編集したりオープンしたり

ここまでできたら、後は基本的に同じです。Desktop クラスで提供している機能をまとめたのが次の表です。

機能 メソッド
編集 edit
メール mail
オープン open
印刷 print

この中から編集とオープンを使ってみました。

サンプルのソースコード DesktopSample2.java

 

import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
 
public class DesktopSample2 {
    public DesktopSample2() throws IOException {
        Desktop desktop = Desktop.getDesktop();
  
        desktop.edit(new File("DesktopSample2.java"));
 
        desktop.open(new File("sample.swf"));
    }
 
    public static void main(String[] args) {
        try {
            new DesktopSample2();
        } catch(IOException ex) {
            ex.printStackTrace();
        }
    }
}

 

実行すると、編集はノートパッドが起動し、オープンは Flash Player が起動しました。

 

おまけ

SimpleFileManager

機能的にはたったこれだけなのですが、Java でデスクトップアプリケーションを書くときには重宝しそうですね。

ということで、簡単ファイルマネージャーを作ってみました。ディレクトリにあるファイルの一覧を表示して、ダブルクリックするとオープンするというものです。。

サンプルのソースコード SimpleFileManager.java

本当は右クリックでポップアップメニューが表示されて、「ブラウズ」、「編集」、「印刷」を選べるようにしたかったのですが、ちょっと問題が。というのは、Desktop#isSupported メソッドでどの項目が使えるかは分かるのですが、ファイル単位では分からないのです。

本当は編集ができないファイルはポップアップの「編集」の項目をグレーにして選択できないようにするなどということをやりたかったのですが、それが分からないのです。うーん、困った。

まぁ、いいや ^^;;

というわけで、とても簡単にネイティブアプリと連携できるので、一度使ってみたらいかがでしょうか。

ところで、Windows で Internet Explorer をデフォルトのブラウザに設定してある場合、ローカルの HTML をオープンすることができません。

また、ファイルを URI に変換して、browse メソッドをコールしても、IE は立ち上がりません。

これはどうやらセキュリティの問題のようですが、どうにかならないでしょうかねぇ。

ちなみに、Firefox や Opera をデフォルトブラウザにしておけば、HTML ファイルをオープンすることも可能です。

 

(Nov. 2005)

(改訂 Feb. 2006) IE でローカル HTML ファイルをオープンできないことを追加