Как обернуть текст в JavaFX - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь создать простое приложение JavaFX, в котором тексты программно добавляются в VBox, расположенный в области прокрутки (чтобы при слишком большом количестве текстов окно можно было прокручивать для просмотра других частей в целом).

Моя проблема в том, что мои тексты не переносятся: они просто выходят из окна на одну строку.

Используя предыдущие ответы StackOverflow, я последовательно пытался:

  • отключение горизонтальной прокрутки моей полосы прокрутки,
  • установка ScrollPane с помощью fitToWidth = "true"
  • привязка моего свойства Texts widthProperty к одному из вложенных макетов
  • привязка моего Texts widthProperty к объекту самой сцены (чего я хотел бы избежать, так как мне нужно установить первый в методе Initialize () моего контроллера, когда сцена еще не доступна, она не работать в любом случае).

Ничто из этого не имело никакого значения (кроме исчезновения горизонтальной полосы прокрутки, которая не имеет смысла, так как вы можете прокручивать панорамированием в любом случае).

Вот мой fxml:

<BorderPane fx:controller="org.duckdns.spacedock.lifepathfx.PathController" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
<center>
<ScrollPane hbarPolicy="NEVER" pannable="true" fitToWidth="true" fx:id="scrollPane" >
    <content>
    <VBox fx:id="mainBox" >

    </VBox>
    </content>
</ScrollPane>
</center>
<top>
<ToolBar>
    <items>
    <Button mnemonicParsing="false" text="Back" onAction="#rollback" />
    </items>
</ToolBar>
</top>

А вот код, куда я добавляю свои тексты:

private void displayNewParagraph()
{
Text text = new Text(someFunctionReturningAString());
text.wrappingWidthProperty().bind(mainBox.widthProperty().subtract(15));
mainBox.getChildren().add(text);
} 

Примечание. Я использую полноэкранный режим, поскольку хочу, чтобы мое приложение отображалось примерно одинаково на всех экранах. Вот почему я не использую фиксированную ширину для текстов.

Редактировать: я попробовал еще одну вещь: связать свойства ScrollPane и VBox width с помощью:

mainBox.maxWidthProperty().bind(scrollPane.widthProperty().subtract(10).subtract(10));
mainBox.minWidthProperty().bind(scrollPane.widthProperty().subtract(10).subtract(10));

Все, что он сделал, это деактивировал горизонтальную прокрутку, но тексты по-прежнему не переносятся: теперь они выходят в окно и их не видно целиком.

Edit2: я тоже пробовал:

text.setWrappingWidth(mainBox.widthProperty().intValue() - 10);

тоже не сработало: текст просто не будет переноситься.

Edit3: я попробовал этот простой эксперимент:

text.setWrappingWidth(150);
System.out.println("wrapping width:" + text.getWrappingWidth());

ширина переноса: 150 выводится, но текст не переносится ... теперь я в замешательстве.

1 Ответ

0 голосов
/ 30 мая 2019

Хорошо, отвечая на мой собственный вопрос, я обнаружил, что обычная процедура - это оборачивать тексты в объект TextFlow.Сделайте это, и тексты будут красиво обернуты.

Что я не понимаю, так это то, почему абсолютно нигде в документе не написано, что тексты не будут переноситься, если они находятся в * Box в ScrollPane, даже если вы установилиих ширина упаковки правильно.

Тем не менее, это говорит о том, что это работает сейчас, тексты добавляются в TextFlow вместо ящика напрямую, и все счастливы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...