Jsch - 系统输入,输出和没有重定向?

时间:2015-01-26 07:40:04

标签: java swing jsch system.in

我正在使用Jcrafts JSch库来构建终端应用程序。

它工作得很好并按照它所说的做,但是我必须将系统重定向,并且错误地使用各种摆动组件,以便在GUI应用程序中工作。

我注意到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用JSch识别箭头和CRTL命令,或者有更好的方法在Java Swing应用程序中显示控制台屏幕?"

Implentation

//System input redirection from TextArea
        TextAreaStream ts = new TextAreaStream(textAreaInput);
        textAreaInput.addKeyListener(ts);
        System.setIn(ts);

1 个答案:

答案 0 :(得分:0)

基本上没有办法在Java控制台上获取单个字符。如果可以阅读整行,你会没事的。但是单个角色是不可能的。你可以做两件事:

  1. 模拟通过Java GUI构建的控制台,并为其设置KeyStroke Listener。
  2. 使用JNI从流中获取原始数据输入。但这似乎非常复杂。