Я работаю над новым проектом. Я пытаюсь отправить команды на внешний компьютер (Linux) через ethernet с Java. Я использую Jsch для создания соединения с оболочкой. Я устанавливаю ввод и вывод оболочки в System.out и System.in.Как перенаправить System.in в TextField JavaFX?
((ChannelShell)channel).setInputStream(System.in);
((ChannelShell)channel).setOutputStream(System.out);
Он работает в консоли! Но мне нужно удалять его из приложения GUI javafx. Я уже решил перенаправление System.out в 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));
}
Но теперь мне нужно также перенаправить System.in к TextField, так что я могу написать что-то в TextField, нажмите клавишу ввода и отправить его через оболочку к внешний компьютер.
Любая помощь была бы оценена. Благодаря!
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();
}
}
Перенаправляющий Системы. out и System.err отлично работает. Он отображается в javafx ListView.
Проблема в том, что при ListView у меня есть «командная строка» javafx TextField, и мне нужно написать некоторую команду ssh в этот TextField и перенаправить его в System.in при нажатии «enter» или нажав «отправить» ".
Причина, по которой мне нужно сделать это, заключается в том, что я использую SSH-связь, которая настроена для System.in и System.out. Он полностью работает в консоли (тестируется), но не в моем графическом приложении.
Спасибо за дальнейшие советы!
Если вы можете создать InputStream, связанный с текстовым полем, попробуйте использовать 'System.setIn (...)'. – Thomas
Извините, я не знаю, как редактировать комментарий ... Я попытался использовать System.setIn (new InputStream()); но мне не удалось преодолеть метод read(). – Zuzana