2014-09-16

【Java】OS独自のファイルダイアログを表示する方法

Categories: Java Swing AWT
java-dialog.png

[ PR ]


Swingの不格好なファイルダイアログ

OS独自のファイルダイアログって便利ですよね。お気に入りのフォルダを登録したりしてカスタマイズして使っています。

それに比べて、Java/Swingで表示されるダイアログは使いづらいと思いませんか?

wired.png

お気に入り機能もなく、ショートカットキーもなし。ボタンも少ないので、本当に不便です。

意外な解決方法

調べていたら、StackOverFlowの記事にいろんな解決方法が紹介されてました。

その中でも最も簡単で、意外と知らない解決法が、 AWTを使うというものです。

ちょっと単純すぎて疑ってしまいますが、以下のウィンドウはAWTのFileDialogを使って表示したものです。

filedialog-awt.png

確かに、Macの標準ダイアログが表示されていますね!

WindowsやLinuxで試せる環境が手元にないので、以下のコードを是非試してみてください。AWTとSwingのダイアログが比較できるようになっています。

NativeFileDialog.java

import java.awt.*;
import javax.swing.*;
import java.io.File;

class NativeFileDialog {

    public static void print(String s){
        System.out.print(s);
    }

    public static void println(String s){
        System.out.println(s);
    }

    public static void main(String[] args) {
        println("");

        showAWTDialog();
        showSwingDialog();

        System.exit(0);
    }

    static void showAWTDialog(){
        FileDialog dialog = new FileDialog(
            (Frame)null, 
            "FileDialog (AWT)", 
            FileDialog.LOAD);

        dialog.setVisible(true);
        String filename = dialog.getFile();

        print("FileDialog (AWT): ");
        if (filename != null){
            println(filename);
        }else{
            println("cancelled");
        }
    }

    static void showSwingDialog(){
        JFileChooser filechooser = new JFileChooser("FileDialog (Swing)");
        int selected = filechooser.showOpenDialog(null);

        print("JFileChooser (Swing): ");
        if (selected == JFileChooser.APPROVE_OPTION){
            File file = filechooser.getSelectedFile();
            String filename = file.getName();
            println(filename);
        }else{
            println("cancelled");
        }
    }
}

コンパイル・実行するには、以下のコマンドをターミナル(コマンドプロンプト)に入力します。

javac NativeFileDialog.java
java NativeFileDialog

すると、まずAWTのダイアログが表示されます。

wired.png

何かを選択またはキャンセルすると、Swingのダイアログが表示されます。

filedialog-awt.png

何かを選択またはキャンセルすると、終了します。

その間に、以下の様なログが表示されます。

FileDialog (AWT): filedialog-awt.png
JFileChooser (Swing): cancelled

まとめ

ネイティブなファイルダイアログを表示するには、SWTが必要と思いがちですが、意外にもAWTで実現可能です。

ただAWTは動作が重いので、できるだけ一部分に留めるのが良さそうです。

Java Swing Hacks ―今日から使える驚きのGUIプログラミング集
Joshua Marinacci Chris Adamson
オライリージャパン
売り上げランキング: 218,517

コメントはTwitterアカウントにお願いします。

RECENT POSTS


[ PR ]

.