13. Dialog / FileDialog

警告や情報の表示、ファイル選択などに使えるダイアログです。ここでは基本的な使い方のみ紹介します。そのほかのコンストラクタやメソッド、フィールドについては API ドキュメントを参照してください。

(1) モーダルダイアログボックスの作り方

 何か入力してボタンを押したとき、それが正しい形式ではなかったとします。この場合、ユーザーに「形式が違います」という小さなフレームを出して知らせることがあります。
 このような状況で使われる小さなフレームがダイアログです。ダイアログは1つのフレームを親として作ります。モーダルダイアログとは、表示されたダイアログを閉じないと親フレームの操作ができなくなるもののことをいいます。

 ダイアログは次のコンストラクタで作ることができます。
Dialog(Frame owner, String title, boolean modal)

 1つの引数のフレームは親になるフレームを指定します。2つの引数はダイアログのタイトルです。3番目の引数が true のとき、モーダルダイアログになります。

 ダイアログはコンテナの1つなので、あとはボタンを張り付けたり、ラベルを付けたりして警告や情報を表示します。

  DialogTest.java

// DialogTest.java

import java.awt.*;
import java.awt.event.*;

public class DialogTest extends Frame implements ActionListener {
    DialogTest() {
        // オープンボタン
        Button open = new Button("Open Dialog");
        // フレームサイズ指定
        setSize(200,200);
        // レイアウト設定
        setLayout(new FlowLayout());
        // ボタンはりつけ
        add(open);
        // リスナ登録
        open.addActionListener(this);
        // フレーム可視化
        setVisible(true);
    }
    
    public void actionPerformed(ActionEvent e) {
        MyDialog dialog = new MyDialog(this,"DialogTest",true);
    }
    
    public static void main(String args[]) {
        DialogTest obj = new DialogTest();
    }
}

class MyDialog extends Dialog implements ActionListener {
    MyDialog(Frame f,String title,boolean modal) {
        // スーパークラス Dialog のコンストラクタ呼び出し
        super(f,title,modal);
        setLayout(new FlowLayout());
        Button close = new Button("Close");
        setSize(200,100);
        add(close);
        close.addActionListener(this);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        dispose();
    }
}


  実行方法

C:\java_test>java DialogTest


  実行例





 この例題のように自作のダイアログを作る場合は Dialog クラスのサブクラスとして作ることがよくあります。また、フレームを作る場合もクラスを Frame クラスのサブクラスにして作るということもあります。

Frame クラスのサブクラスから Dialog を作れば、Dialog のコンストラクタに Frame オブジェクトを渡すのが簡単になります。Frame クラスのサブクラス(自分自身)を渡せばいいから this と書けます。


(2) ファイルを扱う File クラス

 ダイアログを使えば、ファイル選択をするときのファイルダイアログも作ることができます。その前にファイルをJavaでどう扱うのかを見ておきましょう。

 色やフォントもオブジェクトとして扱ってきたように、ファイルもやはりオブジェクトとして扱います。ファイルを表現するクラスは java.io.File クラスです。

 ファイルクラスのコンストラクタは以下のようなものがあります。
File f = new File(String pathname);

 引数にパス名を指定します。フォルダ名でも構いませんし、ファイル名でも構いません。これでファイルのオブジェクトができます。このオブジェクトを使って、ファイルに関する情報を調べることができます。

boolean isFile( )
普通のファイルのとき true を返します。

boolean isDirectory( )
ディレクトリのとき true を返します。

String getParent( )
このファイルオブジェクトの親のパス名を返します。

File getParentFile( )
このファイルオブジェクトの親のファイルオブジェクトを返します。

String getName( )
このファイルオブジェクトのパス名を返します。

String[ ] list( )
このファイルオブジェクトがディレクトリの場合、このディレクトリ内のファイル、サブディレクトリ名を返します。

File[ ] listFiles( )
このファイルオブジェクトがディレクトリの場合、このディレクトリ内のファイル、サブディレクトリのファイルオブジェクトを返します。


 この他にもディレクトリを作ったり、ファイル名を変更するメソッドなど、ほとんどのファイル操作が可能です。ただし、ローカルなファイルに対して操作が出来るのは原則としてアプリケーションプログラムの場合です(中級編1章参照)。

File オブジェクトを作っても実際にファイルができるわけではありません。新規にファイルを作る方法は15章からのストリームで説明します。


(3) FileDialog でファイル選択

 Dialog クラスのサブクラスに java.awt.FileDialog クラスがあります。このクラスはファイルを開いたり、ファイルに保存したりする場合の選択用ダイアログを出すことができます。

 FileDialog クラスのコンストラクタを1つあげておきます。
FileDialog(Frame parent, String title, int mode)

 はじめの2つの引数は Dialog の時と同じで、親になるフレームとダイアログのタイトルを指定します。3番目の引数はファイルを開くか、ファイルを保存するかを指定するためのパラメータです。ここには FileDialog クラスの static 変数を指定します。

FileDialog.SAVE
ファイルに保存するためのダイアログを使うとき

FileDialog.LOAD
ファイルを開くためのダイアログを使うとき

 どのファイル、ディレクトリが選択されたかを調べるには次のメソッドを使います。

String getDirectory( )
このファイルダイアログのディレクトリ名を返します。

String getFile( )
このファイルダイアログの選択されているファイル名を返します。

 何も選択しなかった場合には null が返されます。ファイルダイアログや File クラス、15章から紹介するストリームを組み合わせると、テキストエディタのようなプログラムもつくれます。

  FileDialogTest.java

// FileDialogTest.java

import java.awt.*;
import java.awt.event.*;

public class FileDialogTest extends Frame implements ActionListener {
    FileDialogTest() {
        // ファイルオープンボタン
        Button open = new Button("FileOpen");
        // ファイルセーブボタン
        Button save = new Button("FileSave");
        // フレームサイズ指定
        setSize(200,100);
        // レイアウト設定
        setLayout(new FlowLayout());
        // ボタンはりつけ
        add(open);
        add(save);
        // リスナ登録
        open.addActionListener(this);
        save.addActionListener(this);
        // フレーム可視化
        setVisible(true);
    }
    
    public void actionPerformed(ActionEvent e) {
        FileDialog f;
        // 押されたボタンのラベルを調べる
        String mode = e.getActionCommand();
	
        if ( mode.equals("FileOpen") ) {
            f = new FileDialog(this,"Open",FileDialog.LOAD);
        } else {
            f = new FileDialog(this,"Save",FileDialog.SAVE);
        }
        f.setVisible(true);
        System.out.println("選択したファイルは "+f.getFile());
    }
    
    public static void main(String args[]) {
        FileDialogTest obj = new FileDialogTest();
    }
}


 実行方法 (終了は ctrl+C )

C:\java_test>java FileDialogTest
選択したファイルは null
選択したファイルは readme.html


 実行例



Save のダイアログで上書きしますか?と問い合わせがありますが、「はい」と答えてもファイルに書き込む処理をしていないので何も起こりません。

前の章(12.Frame)   次の章(14.Menu)