2017-12-06 4 views
-1

ユーザーにテキストUIを表示する機能を提供する2つのLinuxコマンドラインプログラム(whiptailおよびdialog)があります。私は、Javaアプリケーションの中からこれらのうちの1つ(好ましくはwhiptail)を呼び出して、ユーザが定義済みのリストからオプションを選択できるようにしたいと思います。以下のSOの質問は、私のコードの中から、Linuxのコマンドを呼び出す方法を考え出すに私に有用だった:Javaアプリケーション内でテキストUI(whiptailまたはダイアログ)をどのように呼び出すのですか?

How to run linux commands in java code?

Want to invoke a linux shell command from Java

これらは、一般的なLinuxのコマンドを実行する方法についての役立つヒントを与える(例: "ls")、私の場合は、私がユーザに表示したいテキストUIのため、少し複雑です(私は思う)。

whiptailのしくみは、thisを参照してください。

+2

これはあなたの最初の投稿であることを理解しています。ようこそ!このフォーラムでは、どのようにして質問をあまりにも曖昧にする傾向があります。通常、何かを試してみて、コードをいくつか表示し、なぜそれがあなたが期待していることをしているのか、それともしていないのかを尋ねますその精神の中で、単にwhiptailを呼び出して、それを表示させることができるかどうかを調べてみてください。その後、結果を戻すことを混乱させることができます。 ところで、JOptionPaneはコード内で同様の機能を実行します。あなたが望むことをするためにSwingプログラミングを少ししなければならないでしょうが、それはもっと簡単になるかもしれません。 – Steve11235

答えて

-1

ProcessBuilderで始まります。あなたはコマンドを送信したい各パラメータは、例えば...

import java.io.IOException; 
import java.io.InputStream; 

public class Test { 

    public static void main(String[] args) throws IOException, InterruptedException { 
     ProcessBuilder pb = new ProcessBuilder(
       "whiptail", "--title", "Check list example", " --checklist", 
       "Choose user's permissions", "20", "78", "4", 
       "NET_OUTBOUND", "Allow connections to other hosts", "ON", 
       "NET_INBOUND", "Allow connections from other hosts", "OFF", 
       "LOCAL_MOUNT", "Allow mounting of local devices", "OFF", 
       "REMOTE_MOUNT", "Allow mounting of remote devices", "OFF"); 
     pb.redirectInput(Redirect.INHERIT); 
     // I tend to use pb.redirectErrorStream(true); 
     // which sends the error stream to the input stream, but 
     // then you'd need to still consume it to get the result 
     Process p = pb.start(); 
     InputStreamConsumer errorConsumer = new InputStreamConsumer(p.getErrorStream()); 

     Scanner input = new Scanner(System.in); 
     String option = input.nextLine(); 

     p.getOutputStream().write(option.getBytes()); 
     p.getOutputStream().flush(); 

     int exitCode = p.waitFor(); 
     System.out.println(exitCode); 

     errorConsumer.join(); 

     System.out.println(errorConsumer.getContent()); 
    } 

    public static class InputStreamConsumer extends Thread { 

     private InputStream is; 
     private StringBuilder content; 

     public InputStreamConsumer(InputStream is) { 
      this.is = is; 
      content = new StringBuilder(128); 
     } 

     public String getContent() { 
      return content.toString(); 
     } 

     @Override 
     public void run() { 

      try { 
       int value = -1; 
       while ((value = is.read()) != -1) { 
        content.append((char)value); 
       } 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 

     } 

    } 
} 

これは、それは単にコマンドを非常に基本的なコマンドリスト内の個別の要素実行され、StringBuilder(検索するにそれの出力を消費後で)、コマンドが存在するまで待って基本的な結果を表示します。

私はにアクセスできないので、コードをテストすることはできませんが、コマンドがOSのデフォルトの検索パスで利用可能な場合は動作するはずです。それ以外の場合はパスを指定する必要がありますコマンドリストの最初の要素の一部としてコマンドに追加

+0

これは、InputStreamConsumerを削除し、代わりに 'pb.inheritIO();'を使用することで簡略化できます。 – VGR

+0

@VGRええ、私は古い学校です...そしてコントロールフリーク:P – MadProgrammer

+0

一方、**端末では動作しないので、OPが尋ねてきたことはしません。 –

関連する問題