//////////////////// 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)
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(実行可能プログラム) としています。