当前位置: 首页 > 面试题库 >

将System.in重定向到摆动组件

滕英奕
2023-03-14
问题内容

大家好,我正在使用Swing和Apache
Commons开发一个终端应用程序。我能够重定向System.outSystem.err一个JTextArea很容易,但我怎么做到这一点的System.in?我需要重写Inputstream方法吗?我需要将Stringfrom
转换JTextArea为byte数组,然后将其传递给InputStream吗?代码示例会很好。


问题答案:

我最近尝试了同样的事情,这是我的代码:

class TexfFieldStreamer extends InputStream implements ActionListener {

    private JTextField tf;
    private String str = null;
    private int pos = 0;

    public TexfFieldStreamer(JTextField jtf) {
        tf = jtf;
    }

    //gets triggered everytime that "Enter" is pressed on the textfield
    @Override
    public void actionPerformed(ActionEvent e) {
        str = tf.getText() + "\n";
        pos = 0;
        tf.setText("");
        synchronized (this) {
            //maybe this should only notify() as multiple threads may
            //be waiting for input and they would now race for input
            this.notifyAll();
        }
    }

    @Override
    public int read() {
        //test if the available input has reached its end
        //and the EOS should be returned 
        if(str != null && pos == str.length()){
            str =null;
            //this is supposed to return -1 on "end of stream"
            //but I'm having a hard time locating the constant
            return java.io.StreamTokenizer.TT_EOF;
        }
        //no input available, block until more is available because that's
        //the behavior specified in the Javadocs
        while (str == null || pos >= str.length()) {
            try {
                //according to the docs read() should block until new input is available
                synchronized (this) {
                    this.wait();
                }
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
        //read an additional character, return it and increment the index
        return str.charAt(pos++);
    }
}

并像这样使用它:

    JTextField tf = new JTextField();
    TextFieldStreamer ts = new TextFieldStreamer(tf);
    //maybe this next line should be done in the TextFieldStreamer ctor
    //but that would cause a "leak a this from the ctor" warning
    tf.addActionListener(ts);

    System.setIn(ts);

自从我编写Java以来​​已经有一段时间了,所以我可能不了解最新的模式。您可能还应该重载,int available()但是我的示例仅包含使它与BufferedReaders readLine()函数一起工作的最低要求。

编辑: 为了使它起作用,JTextField您必须使用implements KeyListener而不是,implements ActionListener然后addKeyListener(...)在TextArea上使用。您需要代替的功能actionPerformed(...)public void keyPressed(KeyEvent e),然后您必须进行测试,if (e.getKeyCode() == e.VK_ENTER)而不是使用整个文本,而只需使用游标前最后一行的子字符串即可,

//ignores the special case of an empty line
//so a test for \n before the Caret or the Caret still being at 0 is necessary
int endpos = tf.getCaret().getMark();
int startpos = tf.getText().substring(0, endpos-1).lastIndexOf('\n')+1;

输入字符串。因为否则,您每次按Enter时都将读取整个TextArea。



 类似资料:
  • 问题内容: 我在cyberciti.biz的评论中看到了这个有趣的问题。 我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。 到目前为止,我对解决方案的想法是: 但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。 欢迎与您分享这个想法。:) 问题答案: 你要 这里的顺序很重要。假设stdin(fd 0),stdout(fd 1)和stderr(fd 2)最初都连接到tty,因此 首先

  • 问题内容: 我有一个扩展了并包含的类(如下所示)。我想重定向和我。我的课似乎没用。当我运行它时,它会重定向系统打印,但不会将它们打印到我的。请帮忙! 注意: 仅在应用程序启动时才重定向呼叫。但是,启动后的任何时间都不会将呼叫重定向到。(即,如果我将a放置在类中,它将被调用,但是如果将其放置在a中以供以后使用,则它不会重定向)。 问题答案: 管道流总是使我感到困惑,这就是为什么我的Message C

  • 我想问一下HTTP到HTTPS的重定向。正如我们所知,重定向是通过从web服务器端重定向来实现的。但是,当涉及到https重定向时,它可以通过两种方式完成,服务器端()和应用程序端()。我想知道: 以下哪种方法有效且性能更好。 考虑到同一服务器上的多个域和域,每种方法的优缺点 非常感谢。 参考: 将Laravel中的WWW重定向到非WWW-堆栈溢出

  • 问题内容: 我想使用PHP将所有www.domain.com请求重定向到domain.com,基本上是: 但是我确实想像SO中那样维护请求的URL,例如: 应该重定向到: 我不想依靠解决方案,并且我不确定要使用哪种变体来实现这一目标。同样,保留HTTPS协议将是一个加号。 我应该怎么做? 问题答案: 将用户重定向到完全相同的页面,www。完整。 因此,要摆脱www。,我们只需替换一行: 那应该起作

  • 我们使用拉维5。要将http连接重定向到https,请使用中间件HttpsProtocol。 在我们的4个测试用例中,只有1个正确工作(最后一个重定向)。其他3种情况的中间件添加了url extra index.php。 http://www.aqualink.az/index.php ---

  • 问题内容: 我正在AIX 6上工作,在KIX Shell上运行Java命令,并且正在尝试调试类加载问题。我放了-verbose:class来打印加载的类,然后>> / home / user / log.log将控制台放到一个文件中。已创建log.log文件,但其大小为零。文件不包含任何信息,所有详细信息都在一闪而过。 问题答案: 也尝试重定向: 您的Java代码可能正在编写您的命令未重定向的信息