• 締切済み

Javaでの質問です。

Javaでの質問です。 現在、JavaでWindowアプリを作成中、SWTのボタンを押すと他のアプリケーションが立ち上がるように作りたいと考えています。 そこで、java.lang.ProcessBuilderクラスを利用して起動したいと考えていたのですが、なぜか動きません。 いろいろ原因を調べているのですが原因が追求できずに困っています。 詳しい方がいれば教えていただけないでしょうか。 【現状】 本体のプログラムはスレッドを用いたプログラムになっている。 ボタンを押して起動するプログラムはスレッドプログラムである。 ボタンを押しても外部プログラムは起動しないが、本体プログラムを終了すると起動してほしい外部プログラムが起動する。 windowsの計算機やメモ帳、paintなどは起動するし、wordやオープンオフィスなんかで実験すると問題なく起動する。 これが現状です。 何か特別な処理を入れなければいけないのか、よくわかっていません。 お手数をおかけします。 何卒、宜しくお願いします。

みんなの回答

  • crossgate
  • ベストアンサー率65% (78/119)
回答No.3

moonfieldさんの補足見てサンプル改作ってみました。(今はコードを載せられない環境にいるので割愛) 大体同じ動きでした。 謎ですね。。。 ・メモ帳はOK ・swingアプリはNG  swtアプリ落としてもswingが上がらなかったのが違うところ  何かミスったか? 追加で確認したこと。 ・Runtime.execも同じ動き ・…swt.program.Programは使えなさそう ・バッチ経由ならProcessBuilderでもイケた  (つまりProcessBuilderはバッチ実行、バッチはjavaコマンドでswingアプリ起動、ならOK)

moonfield
質問者

お礼

crossgate様 ご回答ありがとうございます。 やっぱり動きませんか。 私の場合はバッチで処理した場合もswingを動かしたときと同じ動きになってしまってます。 しかし、これでProcessBuilderで起動するだけではいけないことがわかりました。 さらになにかをプラスするか、もしくはまったく別の方法を探してみます。 ありがとうございます。

  • crossgate
  • ベストアンサー率65% (78/119)
回答No.2

スレッド上でProcessBuilderする。 生成するプロセスはjavaのウィンドウアプリらしい。 というキーワードでサンプル作ってみました。 普通に動きますね。 --------------------------------------- import javax.swing.JFrame; import javax.swing.JLabel; public class HelloWorld extends Thread{   private static boolean call = false;   public void run() {     JFrame frame = new JFrame();     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     frame.getContentPane().add(new JLabel("Hello world"));     frame.setLocationRelativeTo(null);     frame.pack();     frame.setVisible(true);     if (call) {       try {         ProcessBuilder builder = new ProcessBuilder("java", "HelloWorld");         Process process = builder.start();         int ret = process.waitFor();         } catch(Throwable e) {          e.printStackTrace();       }     }   }   public static void main(final String[] args) {     if (args.length == 1) {      call = true;     }     HelloWorld thread = new HelloWorld();     thread.start();   } }

moonfield
質問者

補足

ご回答ありがとうございます。 説明不足で申し訳ありません。 >スレッド上でProcessBuilderする。 >生成するプロセスはjavaのウィンドウアプリらしい。 すいません。微妙に違います。 本体アプリもサブアプリもthreadアプリであること。それが起動に影響しているのではないかと考えているのです。そのために乗せ情報でした。 本体はswtのウィジェットを利用したthreadプログラミングです。その中にボタンがあり、ボタンを押すとSwingで書かれたアプリが立ち上がる予定です。 swingで書かれたサブアプリでもthreadを利用しています。 実験として、swingの何でもないロジックにボタンをつけてactionLisnerから起動してもやはり元アプリを終了させないとサブアプリは立ち上がりませんでした。 すいません。めんどくさい説明ですね。 以上です。

  • crossgate
  • ベストアンサー率65% (78/119)
回答No.1

「外部プログラム」と呼ばれるものが、CUI(バッチなど)で  ・入力待ちになっていないか?  ・標準出力に何か出力するんだけど、Javaでそれを拾ってあげているか? ぐらいかな。。。? WindowsのGUIツールやOfficeは動くけど「外部プログラム」はダメって言われても。 具体的に「外部プログラム」は何ですか? それを書かないとレスが付かない気が。。。

moonfield
質問者

補足

ご回答ありがとうございます。 >具体的に「外部プログラム」は何ですか? ウィンドウアプリケーションです。 javaを利用して自作したプログラムです。 現在、ウィンドウ自体が立ち上がらず、呼び出し元が終了すると同時に起動します。 以上です。

関連するQ&A