如何覆盖JavaFX TextArea组件的自动换行行为?

时间:2016-12-02 13:55:48

标签: java javafx

我通过扩展TextArea组件创建了一个用于盲文输入的新JavaFX组件。不幸的是,TextArea组件的默认自动换行行为将在几个盲文字符的中间突破到一个新行,而不是仅在单词之间的空格处断开。我已经尝试在TextArea组件中搜索定义自动换行为的方法,因此我可以覆盖它们,但我无法找到这些方法。

如何覆盖此自动换行行为,以便只在空格处插入换行符?

1 个答案:

答案 0 :(得分: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()。当文本发生变化时,请在您认为合适的任何地方自行插入换行符。