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. Вы будете в порядке, если все в порядке, чтобы прочитать всю строку. Но один персонаж невозможен. Две вещи, которые вы можете сделать:

  1. Смоделируйте консоль, которая построена через графический интерфейс Java, и установите для нее прослушиватель KeyStroke.
  2. Получить исходные данные из потока с помощью JNI. Но это кажется очень сложным.
Другие вопросы по тегам