动态JTextArea,等待用户输入,如Netbeans Console

时间:2014-02-02 18:19:59

标签: java swing reflection stream console

enter image description here

我正在创建一个IDE,用户可以编译并运行他们的java程序。在这里,用户程序的输出将显示为JEditorPane。我正在使用反射这样做。

我已使用JTextArea将输入流设置为System.setIn(),并使用JEdotorPane方法将输出流设置为System.setOut()

现在,问题在于,当用户运行具有控制台输入的程序(如System.in.read();时,它不会等待来自JEditorPane的用户输入。它只运行程序并从JTextArea读取整个数据。并进一步处理其他代码行。

现在,我希望程序输出应该等待用户输入,当用户在JTextArea中提供输入并按回车键时,则输入文本的进一步处理完成。

另一种方式:通过CMD

实际上,将JTextPane制作成动态窗口有点复杂......我还要对这个特定主题做更多的研究......

所以现在,我只是在显示输出的方式上做了一些改变。我正在使用Runtime类创建一个单独的Process,并在命令提示符(CMD)中执行该过程。

因此,当程序生成输出时。它显示在命令提示符上......就像许多IDE支持这种机制一样......例如......代码块。

现在,它的工作正常......

3 个答案:

答案 0 :(得分:1)

我建议您使用DocumentFilter收听JTextArea的更新。

从那里您可以否决更改,或仅在文档末尾插入更改。此外,它会在对文档进行更新时通知您,以便您将它们发送到您的程序。这应该简化你的生活。

我强烈建议不要使用KeyListener - 他们对像焦点这样的东西非常挑剔。

以下是添加DocumentFilter

的示例
    final Document d = textArea.getDocument();
    if(d instanceof AbstractDocument){
        ((AbstractDocument)d).setDocumentFilter(new DocumentFilter(){               
            @Override
            public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException{
                //Only allow edits at end (yours will be more complicated)
                System.out.println("Called replace");
                if(offset == d.getLength()){
                    //Edit only goes through if the filter bypass is used
                    fb.replace(offset, length, text, attrs);
                }
            }
        });
    }

答案 1 :(得分:1)

嘿,为什么不检查“NetBeans输出”窗口的源代码以获取“灵感”:OutputTab.java

另见:output2 src dir

答案 2 :(得分:0)

嗯,您可以使用KeyListener处理回车键(如果您不知道,您应该在gui(或组件)类中实现它,而不是将其添加到组件中。)和而不是继续处理程序的其余输入。我想是这样的:

    @Override
    public void KeyPressed(KeyEvent e){
    if(e.getKey == e.VK_ENTER){
    processText();
    keepProcessing();

    }

我希望这有帮助!祝你好运。