2016-12-02 2 views
2

Я создал новый компонент JavaFX, который будет использоваться для ввода шрифта Брайля, расширяя компонент TextArea. К сожалению, поведение текстового переноса по умолчанию компонента 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 используется средством визуализации для обеспечения политики переноса текста. Это слишком низкоуровневое, чтобы беспокоиться о переопределении.

Чтобы решить вашу проблему, я бы обернул текст и установил слушателя в textProperty() вашего TextArea. Когда текст изменяется, вставьте новые строки самостоятельно в тех местах, которые вы сочтете подходящими.

+0

Я использую символы шрифта Брайля Юникода (например, в качестве примера), и они не переводят слово должным образом. Настройка слушателя на свойство text создаст кучу новых проблем, и самое главное, как сохранить новые строки, введенные пользователем, в то время как новые строки, введенные программным способом, будут удалены или перемещены по мере добавления или удаления текста. Вы говорите, что свойство wrap text используется средством визуализации, и это относится к низкоуровневому переопределению, но я считаю, что это правильное решение. –

Смежные вопросы