我正在创建一个IDE,用户可以编译并运行他们的java程序。在这里,用户程序的输出将显示为JEditorPane
。我正在使用反射这样做。
我已使用JTextArea
将输入流设置为System.setIn()
,并使用JEdotorPane
方法将输出流设置为System.setOut()
。
现在,问题在于,当用户运行具有控制台输入的程序(如System.in.read();
时,它不会等待来自JEditorPane
的用户输入。它只运行程序并从JTextArea
读取整个数据。并进一步处理其他代码行。
现在,我希望程序输出应该等待用户输入,当用户在JTextArea
中提供输入并按回车键时,则输入文本的进一步处理完成。
另一种方式:通过CMD
实际上,将JTextPane制作成动态窗口有点复杂......我还要对这个特定主题做更多的研究......
所以现在,我只是在显示输出的方式上做了一些改变。我正在使用Runtime类创建一个单独的Process,并在命令提示符(CMD)中执行该过程。
因此,当程序生成输出时。它显示在命令提示符上......就像许多IDE支持这种机制一样......例如......代码块。
现在,它的工作正常......
答案 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
答案 2 :(得分:0)
KeyListener
处理回车键(如果您不知道,您应该在gui(或组件)类中实现它,而不是将其添加到组件中。)和而不是继续处理程序的其余输入。我想是这样的:
@Override
public void KeyPressed(KeyEvent e){
if(e.getKey == e.VK_ENTER){
processText();
keepProcessing();
}
我希望这有帮助!祝你好运。