2015-05-29 52 views
0

我的目標是創建一個僞終端即將顯示數據,我收到。要創建我的僞終端,我使用TextArea,我綁定到StringProperty。當我的StringProperty屬性更改時,我的TextArea必須更新其內容。使用綁定創建/改進僞終端

我實現第一個版本這樣的作品,它顯示的是我收到的每封郵件,但文本區的內容被刪除我每次接收新數據時間。

版本1

在接收數據的類:

StringProperty sendData = new SimpleStringProperty(); 
WHEN I RECEIVE DATA : sendData.set(Arrays.toString(strings)); 

在包含了TextArea類:

@FXML private TextArea consoleTextArea; 
public void setLiaison (StringProperty textRecu){ 
     consoleTextArea.textProperty().bind(textRecu); 
} 

在第三個I類初始化的一切,並呼籲:

Controller.setLiaison(sendData);

不希望我的textarea清除每次我接受,當然數據,所以我試試這個:

consoleTextArea.textProperty().bind(Bindings.concat(consoleTextArea.getText()).concat("\n").concat(textRecu.get())); 

但是這根本不起作用,它只顯示我在TextArea上收到的第一條消息,然後什麼也沒有。

是否有另一種方法來保持我的TextArea使用綁定什麼?

NB:我不能用簡單的方法像追加的文字,因爲我使用MVC,和我的控制器(文本區)必須鏈接到我的模型(StringProperty)。

回答

1

要麼有連接在一起的StringProperty存儲中的所有消息(而不是sendData.set(...)方法,你目前有):每次

sendData.set(sendData.get() + Arrays.toString(strings)); 

更新文本區通過級聯屬性的變化(而不是結合你目前有):

textRecu.addListener((obs, oldText, newText) -> consoleTextArea.appendText(newText)); 

有了這些版本中,如果您有大量的文字進來,你的性能最終會受到影響(因爲字符串連接基本上是一個緩慢的過程)。例如,使用ObservableList<String>來保存所有消息,並使用ListView<String>來顯示它們,如果列表開始變得過滿,則刪除先前的消息可能會更好。