2016-07-26 52 views
0

我目前正在創建一個小型聊天程序(主要是爲了獲得一些RMI和JavaFX體驗)。聊天本身已經完成,現在我正在開發GUI。 我想打印在某種文本區域的類似於此的每個聊天消息:JavaFX:如何在某種文本區域中存儲和格式化多個段落?

愛麗絲<十九時21分35秒>:的Hello World!

這是我的問題/問題:

  1. 使用什麼JavaFX類的嗎?我發現了一個名爲TextFlow的類,它似乎可以做我想做的事,但我不明白它現在的工作原理。或者是一個簡單的TextArea就夠了?
  2. 如何在一行中使用不同的格式?使用HTML?
  3. 我應該如何將收到的短信保存在客戶端?只是總是將它們追加到文本區域(並讓它們通過GUI隱式保存)?或者我應該使用某種ObservableList來緩存消息,並且文本區域與其同步?

消息作爲消息對象接收。這些對象基本上只存儲用戶名,消息和時間戳;他們每個人都有獨立的屬性。

回答

1

這樣做最簡單的方法是通過TextArea,雖然沒有任何整齊的文本格式,但它看起來像一個平淡的NotePad程序。我會推薦使用VBox和文本。一個VBox可以用來存儲所有的文本,並且你可以把VBox放在一個ScrollPane中進行滾動。然後,爲每個消息,把一個由3個文本組成的HBox。這裏是一個例子

//Put this method in your Application class 
public static void addMessage(Message message){ 
    Text username = new Text(message.getUsername()); 
    username.setFont(Font.font("Verdana", FontWeight.BOLD, 14)); 
    Text date = new Text(message.getTimestamp()); 
    date.setFont(Font.font("Verdana", FontWeight.ITALIC, 12)); 
    date.setFill(Color.GRAY); 
    Text message = new Text(message.getMessage()); 
    date.setFont(Font.font("Courier New", 12)); 
    mainBox.getChildren().Add(new HBox(username, date, message)); //mainBox being a VBox that stores all your HBoxes. 
} 

很明顯,改變這個以適應你的需要,並請改變造型。我只是舉了一個例子。這是我之前做的,而且正確的樣式,它看起來比在TextArea上傾斜更好。

+0

這聽起來很有趣,謝謝。我會在有空的時候嘗試。 – DonGiovanni

0
  1. 如果您的格式要求是固定的,那麼Text和TextFlow將是一個很好的開始。每個文本節點都可以通過代碼或通過CSS分配樣式。將多個文本節點放在一起放入TextFlow中。將TextFlow節點放入佈局容器中。從VBox開始進行測試,但是我建議在基本工作後使用TableView。 TextFlow的javadoc包含了一些示例代碼片段,可以幫助您解決問題。

  2. 對於純JavaFX解決方案,然後使用多個文本節點,使用CSS樣式。可以在每個節點上設置格式屬性,也可以分配樣式並使用外部.css文件。或者如果你想考慮第三方組件,那麼像這樣的:https://github.com/TomasMikula/RichTextFX可能是一個很好的開始。

  3. 您一定希望將數據模型與顯示模型(或查看,如果要使用該術語)分開。構建一個數據類(例如Message)。如果將消息數據保存在Message對象的ObservableList中,則可以將其綁定到TableView,並在添加或刪除列表中的條目時自動更新表。將代碼添加到表單元格工廠,以控制從數據模型呈現每個單元格的方式(例如,通過創建TextFlow來繪製內容)。

相關問題