[英]Dynamic JTextArea which wait for user input like Netbeans Console
我正在创建一个IDE,用户可以编译和运行他们的java程序。 这里,用户程序的输出将显示给JEditorPane
。 我正在使用反射这样做。
我已使用System.setIn()
将输入流设置为JTextArea
,并使用System.setOut()
方法将输出流输出到JEdotorPane
。
现在,问题是当用户运行一个具有控制台输入的程序,如System.in.read();
它不会等待来自JEditorPane
用户输入。 它只是运行程序并从JTextArea
读取整个数据。 并进一步处理其他代码行。
现在,我希望程序输出应该等待用户输入,当用户在JTextArea
提供输入并按Enter键时,则完成对输入文本的进一步处理。
另一种方式:通过CMD
实际上,将JTextPane制作为动态窗口有点复杂......我还要对这个特定主题做更多研究......
所以现在,我只是在显示输出的方式上做了一些改变。 我正在使用Runtime类创建一个单独的Process,并在命令提示符(CMD)中执行该过程。
所以,当程序生成输出时。 它显示在命令提示符上......就像许多IDE支持这种机制一样......例如......代码块。
现在,它的工作正常......
我建议使用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);
}
}
});
}
嘿,为什么不检查“灵感”的NetBeans输出窗口的来源: OutputTab.java
再看一下: output2 src dir
嗯,您可以使用KeyListener
处理输入键(如果您不知道,您应该在gui(或组件)类中实现它,而不是将其添加到组件中。)然后继续处理其余的程序的输入。 我会这样想:
@Override
public void KeyPressed(KeyEvent e){
if(e.getKey == e.VK_ENTER){
processText();
keepProcessing();
}
我希望这有帮助! 祝好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.