簡體   English   中英

動態JTextArea,等待用戶輸入,如Netbeans Console

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM