2016-12-02 45 views
2

我已經通過擴展TextArea組件創建了一個新的JavaFX組件用於盲文輸入。不幸的是,TextArea組件的默認文字包裝行爲將在多個盲文字符中間突然出現,而不是僅在單詞之間的空格處打破。我已經嘗試搜索定義TextArea組件中的單詞包裝行爲的方法,以便我可以重寫它們,但是我一直無法找到這些方法。如何覆蓋JavaFX TextArea組件的單詞包裝行爲?

如何覆蓋此自動換行行爲,以便換行符只能插入空格處?

回答

0

我玩過JavaFX TextArea的默認行爲。我使用了標準的拉丁字母以及Unicode字符。兩者表現都一樣。

啓用文本換行後,默認策略似乎是在超出區域寬度之前在第一個空格處打破。如果單個「單詞」(任何連續的字符序列)太長而不適合容器的寬度,則它將從新行開始,在容器的寬度處斷開並繼續到下一行。這正是我期望在這種情況下。你已經告訴過你要強制文本換行,如果一個單詞不符合要求,那麼它可以做的並不是很多。

無論如何,a TextArea has a property wrapText它允許我們控制是否將添加文本包裝。查看源代碼中使用這個值的位置可能會讓我們對如何使用它有所瞭解。

private static final CssMetaData<TextArea,Boolean> WRAP_TEXT = 
     new CssMetaData<TextArea,Boolean>("-fx-wrap-text", 
      StyleConverter.getBooleanConverter(), false) { 

     @Override 
     public boolean isSettable(TextArea n) { 
      return !n.wrapText.isBound(); 
     } 

     @Override 
     public StyleableProperty<Boolean> getStyleableProperty(TextArea n) { 
      return (StyleableProperty<Boolean>)(WritableValue<Boolean>)n.wrapTextProperty(); 
     } 
}; 

有效這裏發生了什麼是這個布爾屬性被綁定到一個CSS屬性-fx-wrap-text。這個CSS屬性只接受一個布爾參數 - 文本換行打開或關閉,沒有其他模式。然後,我們可以假定呈現器正在使用CSS屬性來強制執行文本換行策略。這太低級了,無法克服覆蓋。

爲了解決您的問題,我會關閉文本換行併爲您的TextArea的textProperty()設置偵聽器。當文字改變時,你可以在你認爲合適的地方插入換行符。

+0

我正在使用盲文unicode字符(as,作爲示例),並且它們沒有正確包裝。在文本屬性上設置監聽器會產生一堆新問題,大多數情況下,直接如何保留用戶輸入的新行,同時允許在添加或刪除文本時刪除或移動以編程方式輸入的新行。你說包裝文本屬性正在被渲染器使用,這是低級別覆蓋,但我相信這是適當的解決方案。 –