2014-10-06 73 views
1

所以即時創建服務器,並且工作良好,但是我有點卡在GUI上。你看,我希望它看起來像命令提示符,只有下一行是可編輯的,它不會讓你刪除任何其他文本。所以,現在我有:如何僅使JTextArea(+ JScrollPane)的下一行可編輯

JTextArea ta = new JTextArea(); 
JScrollPane sp = new JScrollPane(ta); 

然後在框架的東西...

f.setTitle("Server"); 
    f.setBounds(ss.width - 600, 50, 550, 350); 
    f.setResizable(false); 
    f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//added window listener so closes socket connection first 
    f.setAlwaysOnTop(true); 

隨後將其加入:

f.add(sc); 
    jt.setBackground(Color.BLACK); 
    jt.setForeground(Color.WHITE); 
    //jt.setEditable(false); 

最後,我用它來輸出到文本區的方法:

public static void append(String text) { 
    jt.append(text); 
    jt.append("\n\n"+System.getProperty("user.name")+"/"+getIp()+" > "); 
    jt.setCaretPosition(jt.getDocument().getLength()); 
} 

現在我需要assig n一個字符串,用於在用戶按下Enter鍵後鍵入JTextArea:>?

jt.addActionListener(...{ 
    public void ActioEvent(ActionEvent e){ 
     String text = JTextArea.getLines().getLastLine().getText().replace(System.getProperty("user.name")+"/"+getIp()+"  > ", ""); 
    } 
}); 

也許這樣的事情? 然後我需要它,以便只有「>」後面的部分是可編輯的?

+2

在JTextArea下使用JTextField。 – 2014-10-06 16:53:18

+0

但是,雖然這是更容易,這不是_really_我想要的 – 2014-10-06 16:57:58

+0

它不是你想要的?除非我錯過了一些要求,這正是你要找的。這是解決這個問題的標準方法。請注意,您可以修改邊框以及文本組件的內容,以便它們看起來像是一個組件,如果這是您所擔心的。 – 2014-10-06 16:59:14

回答

1

要做到這一點的方法是用DocumentFilter。這是一個相當模糊而且很少使用的Java部分,而且遠非易於使用。不過,它允許您在UI(編輯富文本內容的位置)和底層模型(內容)之間插入DocumentFilter。您可以通過過濾器來傳遞所有'插入'和'刪除'操作,過濾器可以接受,拒絕或修改它們。您可以對過濾器進行編碼,以僅允許修改命令行,而不是提示。

正如我所說,這是一個非常艱難的編碼,並且Document/DocumentFilter結構具有很多複雜性,您的特定應用程序不需要。但它確實爲您提供了所需的設施。

在標準的Java文檔頁面有一個教程,但不是高級的,我知道的很少的例子都在網絡上。

ProtectedTextComponent(謝謝camickr)提供了一個如何做類似的例子。

+1

'這是一個非常艱難的編碼' - 我同意:)如果你有興趣,你可以看看[受保護的文本組件](http://tips4java.wordpress.com/2008/12/21/protected-文本組件/)爲您處理這個問題。 – camickr 2014-10-06 19:18:43

+0

@camickr這是一個很好的課程,可以簡化很多事情。介意我是否將其納入我的答案? – DJClayworth 2014-10-06 19:54:12

+0

正如我在我的回答中所述,您將無法按原樣使用課程,但可以隨意玩,定製和實驗。 – camickr 2014-10-06 20:04:02

0

使用Collection a JTextField
讓用戶鍵入JTextField,並且一旦他按下enter,將控件移動到下一個JTextField,同時使上面的JTextField不可編輯,並從中刪除JScrollPane

希望這會有所幫助。

0

我也同意JTextArea/JTextField方法是常用和簡單的方法。

但是,如果你想使你的生活複雜一點,那麼你可以檢查出Protected Text Component這將爲你做大部分的邏輯。

ProtectedDocument的當前實施僅允許您爲文檔添加保護,而不是將其刪除,因此首先需要添加一種方法來「清除」所有保護文本。這很簡單,你只需清除該類使用的Map中的條目即可。

接下來,您需要替換JTextPane使用的默認「Enter」操作。您可以通過使用文本區域的Key Bindings來完成此操作。有關基本信息,請參見Key Bindings。在您的自定義操作中,您首先需要調用新創建的「clear(...)」方法。然後你會將文本添加到文本區域。最後你會保護所有文本,但最後的「x」個字符。