Splitpane JavaFX: визуализация текста на одном уровне на обеих панелях - PullRequest
0 голосов
/ 23 сентября 2018

Я строю приложение для преобразования текста в текст.Я использую разделенную панель для отображения.Левая панель отображает динамически изменяющуюся речь в текстовую информацию.Правая панель отображает фиксированный текст «да / нет» для каждого предложения, произнесенного на левой панели того же уровня.

Чтобы убедиться, что «Да / Нет» отображается на том же уровне, что и предложение на левой панели, я добавляю текст на левой и правой панелях в соответствующие Hbox (Splitpane_left_hbox (Речь к тексту)и Splitpane_right_hbox («Да / Нет»)) всякий раз, когда произносится новое предложение.

Левый и правый боксы помещаются в left_Vbox и right_vbox для вертикальной визуализации речи в текстовые предложения.

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

ПРОБЛЕМЫ:

  1. Splitpane_left_hbox.getHeight () возвращает 0.0 дажехотя в нем есть текст.
  2. Это не позволяет мне установить значение для Splitpane_left_hbox, чтобы расположить их на одном уровне.

Вопросы:

  1. Как получить окончательную высоту Splitpane_left_hbox после того, как к нему был добавлен текст в речь?

  2. Есть ли более эффективный способ сделать эти текстыпоявляются на одном уровне на обеих панелях?

Файл FXML:

<SplitPane fx:id="split_pane" dividerPositions="0.49613899613899615" prefHeight="497.0" prefWidth="1040.0">
     <items>
        <ScrollPane prefViewportHeight="341.0" prefViewportWidth="512.0">
           <content>
              <VBox fx:id="split_pane_1_Vbox" prefHeight="494.0" prefWidth="513.0">
                 <children>
                    <HBox fx:id="split_pane_1_hbox" fillHeight="false">
                       <children>
                          <Text fx:id="text_1" />
                       </children>
                    </HBox>
                 </children>
              </VBox>
           </content>
        </ScrollPane>
        <ScrollPane prefViewportHeight="341.0" prefViewportWidth="520.0">
           <content>
              <VBox fx:id="split_pane_2_Vbox" prefHeight="496.0" prefWidth="523.0">
                 <children>
                    <HBox fx:id="split_pane_2_hbox" prefHeight="300.0" prefWidth="200.0" />
                    <children>
                       <Text fx:id="text_2" />
                   </children>
              </VBox>
           </content>
        </ScrollPane>
     </items>
  </SplitPane>

Метод Java:

void addFinalText(String sentence) {



    Text text_1 = new Text(sentence.trim());
    text_1.setFont(Font.font(null, FontWeight.MEDIUM, textSize));
    double[] dividerPositions = split_pane.getDividerPositions();



    double split_pane_width = split_pane.getPrefWidth();
    double single_pane_width = dividerPositions[0] * split_pane_width;
    text_1.setWrappingWidth(single_pane_width);


    Text text_2 = new Text();
    text_2.setFont(Font.font(null, FontWeight.MEDIUM, textSize));




    Text text = new Text();
    text.setText(sentence.trim() +  " ");
    text.setFont(Font.font(null, FontWeight.MEDIUM, textSize));


    if (sentence.contains("hi")) {

        text_2.setText("Yes" + "\n");
        text_2.setFill(Color.RED);
        text_1.setFill(Color.RED);
    }
    else {
        text_2.setText("No" + "\n");
    }

    HBox left_hbox = new HBox();
    left_hbox.getChildren().add(text_1);
    double leftHboxHeight = left_hbox.getHeight();

    HBox right_hbox = new HBox();
    right_hbox.setHeight(leftHboxHeight);
    right_hbox.getChildren().add(text_2);

    right_hbox.getChildren().add(text_2);
    left_hbox.getChildren().add(text_1);

}

Приложениеснимок экрана:

Я новичок в JavaFx.Заранее спасибо.`

1 Ответ

0 голосов
/ 24 сентября 2018

Узлы не располагаются перед следующим проходом макета.Эта передача макета происходит через некоторое время после возврата метода.Было бы лучше использовать Pane для текста Да / Нет и связать свойство layoutY этих узлов со свойством layoutY.Просто убедитесь, что вертикальное выравнивание текста, добавляемого справа, является правильным.

Упрощенный пример

@Override
public void start(Stage primaryStage) {
    VBox left = new VBox();
    Pane right = new Pane();

    Button button = new Button("Add");

    HBox hbox = new HBox(left, right, button);
    button.setOnAction(new EventHandler<ActionEvent>() {
        private int count = 1;

        private final StringBuilder builder = new StringBuilder("1");

        @Override
        public void handle(ActionEvent event) {
            Text text = new Text(builder.toString());
            Text yesNo = new Text(count % 2 == 0 ? "Yes" : "No");
            yesNo.setTextOrigin(VPos.TOP);

            HBox container = new HBox(text);

            left.getChildren().add(container);
            left.getChildren().add(text);
            right.getChildren().add(yesNo);
            yesNo.layoutYProperty().bind(container.layoutYProperty());

            count++;
            builder.append('\n');
            for (int i = 0; i < count; i++) {
                builder.append('1');
            }
        }

    });

    Scene scene = new Scene(hbox, 400, 400);
    primaryStage.setScene(scene);
    primaryStage.show();
}

Обратите внимание, что это не синхронизирует прокрутку для обоих ScrollPane s.Я рекомендую использовать GridPane и добавить текст к тому же ScrollPane.

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