私は新しいプロジェクトに取り組んでいます。私はJavaからイーサネットを介して外部のコンピュータ(Linux)にコマンドを送信しようとしています。私はシェル接続を作成するためにJschを使用しています。シェルの入力と出力をSystem.outとSystem.inに設定しました。System.inをJavaFX TextFieldにリダイレクトするにはどうすればよいですか?
((ChannelShell)channel).setInputStream(System.in);
((ChannelShell)channel).setOutputStream(System.out);
コンソールで動作します。しかし、私はjavafx GUIアプリケーションからリモートにする必要があります。私はすでにのTextAreaにはSystem.outのリダイレクトを解決した:
public void redirectOutputStream() {
OutputStream out = new OutputStream() {
private final StringBuilder sb = new StringBuilder();
@Override
public void write(int b) throws IOException {
if (b == '\r') {
return;
}
if (b == '\n') {
final String tmp = sb.toString() + "\n";
text.add(tmp);
updateText(text);
sb.setLength(0);
} else {
sb.append((char) b);
}
}
};
System.setOut(new PrintStream(out, true));
// System.setErr(new PrintStream(out, true));
}
しかし、私は、テキストフィールドに何かを書くことができるように、今、私は、テキストフィールドにSystem.inをリダイレクトするためにも必要Enterキーを押しますとにシェルを介してそれを送信外部コンピュータ。
助けていただければ幸いです。ありがとう!
EDIT: 申し訳ありませんが、それでも私のために動作しません:(... 今私は、コードのこの作品(私はJavaFXのを使用しています)があります。システムの
/** Tmp queue for standard input redirecting */
BlockingQueue<Integer> stdInQueue = new LinkedBlockingQueue<>();
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
redirectOutputStream();
redirectInputStream();
}
/** redirects standard System.out to GUI command_window */
public void redirectOutputStream() {
OutputStream out = new OutputStream() {
private final StringBuilder sb = new StringBuilder();
@Override
public void write(int b) throws IOException {
if (b == '\r') {
return;
}
if (b == '\n') {
final String tmp = sb.toString() + "\n";
text.add(tmp);
updateText(text);
sb.setLength(0);
} else {
sb.append((char) b);
}
}
};
System.setOut(new PrintStream(out, true));
System.setErr(new PrintStream(out, true));
}
/** redirects standard System.in to GUI command_line */
public void redirectInputStream() {
InputStream in = new InputStream() {
@Override
public int read() throws IOException {
try {
int c = stdInQueue.take().intValue();
return c;
} catch (InterruptedException exc) {
Thread.currentThread().interrupt();
return -1;
}
}
};
System.setIn(in);
}
@FXML
void sendButtonPressed(ActionEvent event) {
if (!command_line.getText().isEmpty()) {
for (char c : command_line.getText().toCharArray()) {
System.out.write(new Integer(c)); //display in ListView (output)
stdInQueue.add(new Integer(c));
}
System.out.write(new Integer('\n')); //display in ListView (output)
stdInQueue.add(new Integer('\n'));
command_line.clear();
}
}
リダイレクトを。私は "コマンドライン" javafx TextFieldを持っているので、このTextFieldにリダイレクトするsshコマンドを書く必要があります。 「Enter」を押すか「send」をクリックするとSystem.inに送信されます"ボタンをクリックします。
私がこれを行う必要があるのは、System.inとSystem.outに設定されているSSH通信を使用しているからです。コンソール(テスト済み)では完全に動作しますが、私のGUIアプリケーションでは動作しません。
ありがとうございます。
テキストフィールドにリンクされたInputStreamを作成できる場合は、 'System.setIn(...)'を使って試してみてください。 – Thomas
申し訳ありませんが、私はコメントを編集する方法がわかりません...私はSystem.setIn(新しいInputStream())を使用しようとしました。私は "read()"メソッドをオーバーライドして成功していませんでした。 – Zuzana