我通过扩展TextArea组件创建了一个用于盲文输入的新JavaFX组件。不幸的是,TextArea组件的默认自动换行行为将在几个盲文字符的中间突破到一个新行,而不是仅在单词之间的空格处断开。我已经尝试在TextArea组件中搜索定义自动换行为的方法,因此我可以覆盖它们,但我无法找到这些方法。
如何覆盖此自动换行行为,以便只在空格处插入换行符?
答案 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()
。当文本发生变化时,请在您认为合适的任何地方自行插入换行符。