[英]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.