Ich arbeite an einem neuen Projekt. Ich versuche Befehle über Linux an einen externen Computer (Linux) zu senden. Ich benutze Jsch, um eine Shell-Verbindung zu erstellen. Ich setze Shell-Eingabe und Ausgabe auf System.out und System.in.Wie kann ich System.in zu JavaFX TextField umleiten?
((ChannelShell)channel).setInputStream(System.in);
((ChannelShell)channel).setOutputStream(System.out);
Es funktioniert in der Konsole! Aber ich muss es von der javafx GUI App fernsteuern. Ich habe bereits gelöst Umleiten von System.out zu TextArea-:
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));
}
Aber jetzt brauche ich auch System.in zu TextField- umleiten, so dass ich etwas in TextField- zu schreiben, drücken Sie die Eingabetaste und durch Shell die schicken externer Computer.
Jede Hilfe wäre zu schätzen. Vielen Dank!
EDIT: Sorry, noch nicht für mich funktioniert :(... Jetzt habe ich dieses Stück Code (ich bin mit 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();
}
}
Das Umleiten des Systems. out und System.err funktioniert einwandfrei.Es wird in javafx ListView angezeigt.Es ist in der ListView Javafx TextField und ich muss einige ssh-Befehl in diese TextField und Redirect schreiben Wenn Sie auf "Enter" drücken oder auf "Send " Taste.
Der Grund, warum ich dies tun muss, ist, dass ich SSH-Kommunikation verwende, die für System.in und System.out festgelegt ist. Es funktioniert vollständig in der Konsole (getestet), aber nicht in meiner GUI-App.
Vielen Dank für weitere Beratung!
Wenn Sie einen InputStream erstellen können, der mit dem Textfeld verknüpft ist, versuchen Sie es mit 'System.setIn (...)'. – Thomas
Sorry, ich weiß nicht, wie ich den Kommentar bearbeiten kann ... Ich habe versucht, System.setIn (new InputStream()) zu verwenden; aber ich war nicht erfolgreich mit dem Überschreiben der "read()" Methode. – Zuzana