javax.swing.JFileChooser

目的
"ファイルを開く"ダイアログで選択されたアプリケーションを実行する。(ランチャ)

関連クラス

今回のソース
//////////////////// Executer.java ////////////////////

import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.GridLayout;

class Executer extends JFrame
{
	// プログラムのパス
	File program;

	// プログラムが開かれたかどうかのフラグ
	boolean open_flag = false;

	// 状態を表示するラベル
	JLabel open_status;
	JLabel path_info;

	public static void main(String args[])
	{
		new Executer();
	}

	public Executer()
	{
		open_status = new JLabel("File is not open.");
		path_info   = new JLabel("");

		setTitle("Exec Test");
		setSize(255,255);

		// ウインドウリスナの登録
		WindowListener w_listener = new WindowAdapter()
		{
			public void windowClosing(WindowEvent window_event)
			{
				System.exit(0);
			}
		};
		addWindowListener(w_listener);

		// ボタンの生成と、アクションリスナの登録
		JButton button_open = new JButton("Open...");
		ActionListener listener_button_open = new ActionListener()
		{
			public void actionPerformed(ActionEvent action_event)
			{
				JFileChooser file_choose = new JFileChooser();
				file_choose.addChoosableFileFilter(new ExecFilter());	// ファイルフィルタの登録

				// 開くが押された時に、以下を処理する
				if(file_choose.showOpenDialog(Executer.this) == JFileChooser.APPROVE_OPTION)
				{
					program = file_choose.getSelectedFile();
					open_flag = true;
					open_status.setText("File is Opened.");
					path_info.setText(program.getAbsolutePath());
				}
			}
		};
		button_open.addActionListener(listener_button_open);

		JButton button_run = new JButton("Run");
		ActionListener listener_button_run = new ActionListener()
		{
			public void actionPerformed(ActionEvent action_event)
			{
				if(open_flag)
				{
					try
					{
						// Runtimeオブジェクトの取得
						Runtime runtime = Runtime.getRuntime();
						runtime.exec(program.getAbsolutePath());
					}
					catch(IOException io_exception)
					{
						System.err.println(io_exception.toString());
					}
				}
			}
		};
		button_run.addActionListener(listener_button_run);

		// コンポーネントの配置
		getContentPane().setLayout(new GridLayout(4,1));

		getContentPane().add(button_open);
		getContentPane().add(open_status);
		getContentPane().add(path_info);
		getContentPane().add(button_run);

		setVisible(true);
	}
}

////////////////////////////////////////////////////////////

//////////////////// ExecFilter.java ////////////////////

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

public class ExecFilter extends FileFilter
{
	final static String exec = "exe";

	// ディレクトリと拡張子"exe"のファイルを許可する。
	public boolean accept(File f)
	{
		// ディレクトリを許可
	        if(f.isDirectory())
		{
			return true;
		}

		// exeファイルを許可
		String s = f.getName();
		int i = s.lastIndexOf('.');

		if(i > 0 &&  i < s.length() - 1)
		{
			// .より後の文字列を比較する
			String extension = s.substring(i+1).toLowerCase();
			if (exec.equals(extension))
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		return false;
	}

	// "exe"ファイルの説明
	public String getDescription()
	{
		return "Executable Programs";
	}
}

////////////////////////////////////////////////////////////
Source is here. (ZIP Format,1747Byte,Shift-JIS)

コンパイル&実行
javac Executer.java
java Executer

説明
(概略)

Runtime.execメソッドを使って、プログラムを実行するプログラムです。
手順はいたって単純で、Runtime.getRuntimeメソッドを使って、
Runtimeオブジェクトを得て、execを呼び出すだけです。
今回は、下図のように、JFileChooserを使って、
.exeファイルのみを表示できるようなファイルダイアログで、
実行できるプログラムを指定出来るようにしました。

拡張子で絞り込み出来る

(サンプルプログラムの説明)

ウインドウリスナの登録
Windowsリスナは、登録されたウインドウを見張るものです。
ウインドウの状態を監視することで、各種のイベント処理を行うことが出来ます。
また、WindowAdapterクラスを用いることで、WindowEvent中の
必要なイベントについてのみ、処理を行わせることが出来ます。
アクションリスナの登録
Windowリスナの登録とほぼ同じです。
アクションリスナが登録されたコンポーネントは、
その状態を監視され、イベント処理を行うことが出来ます。
file_choose.addChoosableFileFilter(new ExecFilter()); // ファイルフィルタの登録
概略の実行イメージを見てもらうと分かるのですが、
ファイルタイプによって、表示されるファイルを絞るのに使います。
今のところは、javax.swing.filechooser.FileFilterクラスのサブクラスを定義して、
それを登録するしかないようです。
もう少しフレンドリーな、プログラムインターフェースにして欲しいですね。
getContentPane().setLayout(new GridLayout(4,1));
Swingプログラミングでは、javax.swing.JFrame.addメソッドを
直接呼ばずに、getContentPane().addメソッドを呼び出します。
でないと、コンパイル時にエラーが発生します。
こうする理由は、従来使っていたawtの、Frameクラスと
SwingのJFrameでは互換性が無いからです。
public boolean accept(File f)
このメソッドでは、ファイルオブジェクトを受け取って、
そのファイルを調べ、条件に適合したファイルのみを、ダイアログに表示するというものです。
この場合は、拡張子がexeのものとフォルダに対してはtrueを、
それ以外のファイルに対してはfalseを返すことによって、
ファイルの選別(フィルタリング)を行っています。
恐らく(試したわけではないのですが)、File.lengthメソッドを使えば、
ファイルサイズによるフィルタリングも出来るでしょう。
public String getDescription()
このメソッドは、acceptされるファイルについての説明を、
Stringオブジェクトで返します。
今回は、exeファイルが対象なので、Executable Programs(実行可能プログラム)
としています。