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