Jsch - система вход, выход и er без перенаправления?
Я в процессе игры с Jcrafts JSch Library для создания приложения терминала.
Он отлично работает и выполняет то, что говорит, однако мне приходится перенаправлять System, и ошибаться на различные компоненты Swing, чтобы она работала в приложении с графическим интерфейсом.
Я заметил, что при перенаправлении System.in для отправки текста в System.in используется нажатие клавиши, это нормально, пока вам не понадобится, например, использовать ключи CRTL. Также стрелка вверх для предыдущих команд.
Класс для перенаправления System.in и KeyListener для отправки
public class TextAreaStream extends InputStream implements KeyListener {
private JTextArea ta;
private String str = null;
private int pos = 0;
public TextAreaStream(JTextArea jtf) {
ta = jtf;
}
//gets triggered everytime that "Enter" is pressed on the textfield
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == e.VK_ENTER)
{
str = ta.getText() + "\n";
pos = 0;
ta.setText("");
synchronized (this) {
this.notifyAll();
}
}
}
@Override
public int read() {
if(str != null && pos == str.length()){
str =null;
return java.io.StreamTokenizer.TT_EOF;
}
while (str == null || pos >= str.length()) {
try {
synchronized (this) {
this.wait();
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
return str.charAt(pos++);
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
У меня вопрос: есть ли способ заставить System.in распознавать стрелки вверх и CRTL-команды с помощью JSch или есть лучший способ отображения экрана консоли в приложении Java Swing?
Implentation
//System input redirection from TextArea
TextAreaStream ts = new TextAreaStream(textAreaInput);
textAreaInput.addKeyListener(ts);
System.setIn(ts);
1 ответ
По сути, нет никакого способа получить один единственный символ на консоли Java. Вы будете в порядке, если все в порядке, чтобы прочитать всю строку. Но один персонаж невозможен. Две вещи, которые вы можете сделать:
- Смоделируйте консоль, которая построена через графический интерфейс Java, и установите для нее прослушиватель KeyStroke.
- Получить исходные данные из потока с помощью JNI. Но это кажется очень сложным.