当前位置: 首页 > 知识库问答 >
问题:

Splitpane JavaFX:两个窗格上的文本呈现在同一级别上

巩阳秋
2023-03-14

我正在构建一个文本语音应用程序。我正在使用splitpane来显示它。左窗格显示动态变化的语音到文本信息。右窗格显示一个“是/否”固定文本为每个句子说在左窗格在同一级别。

为了确保“Yes/No”显示在与左窗格中的句子完全相同的级别上,每当说出新句子时,我将在左窗格和右窗格中添加文本到相应的HBox(Splitpane_left_hbox(语音到文本句子)和Splitpane_right_hbox(“Yes/No”))。

左框和右框放置在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设置一个值以将它们定位在同一级别。

>

  • 在将语音到文本的文本添加到Splitpane_left_hbox后,如何获得Splitpane_left_hbox的最终高度?

    是否有更有效的方法使这些文本在两个窗格上显示在同一级别?

    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>
    
    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);
    
    }
    

    App截图:

    我是JavaFX新手。提前道谢。`

  • 共有1个答案

    宰父焕
    2023-03-14

    在下一个布局通过之前不定位节点。此布局传递发生在方法返回后的某个时间。最好为Yes/No文本使用窗格并将这些节点的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的滚动。我建议使用GridPane并将文本添加到相同的ScrollPane中。

     类似资料:
    • 在过去的一个小时里,我一直在尝试让Chart.js在同一页上呈现两个折线图。我已经确保我的画布元素ID是唯一的,我的变量也是唯一的。 这是在使用chart.js v2.8.0 下面是inspect元素的错误日志。 在

    • 我在linux服务器上的一个备份中遇到了一个问题,它以某种方式将文件的所有文件夹向下移动了一个级别,放入了一个同名的新文件夹。我想将所有文件返回到其原始位置。许多文件的名称中有空格,使事情复杂化。 原始目录结构: 目录结构不正确: 请注意,我不希望子文件夹中的文件移动到文件夹1中,但我确实希望子文件夹本身向上移动一级。 我尝试了一些类似的命令,基于这里一些相关的线程,但没有成功,而是尝试将文件移动

    • 我是ExtJS新手。 我在同一页上有两个网格。第一个网格有3列。只有第二个。问题是,当渲染第二个网格时,它会覆盖第一个网格的属性。 例如,当我试图编辑第一个网格中的行时,它需要第二个网格中的行的宽度。

    • 问题内容: 我想知道如果在同一个对象上同步两次,在Java中是否会出现任何奇怪的行为? 场景如下 两种方法都使用该对象并对其进行同步。当第一个方法调用第二个方法时,它会被锁定而停止吗? 我不这么认为,因为它是同一个线程,但是我不确定是否可能会出现其他任何奇怪的结果。 问题答案: 同步块使用 可重入 锁,这意味着如果线程已经持有该锁,则它可以重新获取它而不会出现问题。因此,您的代码将按预期工作。 请

    • 我还希望com.mypack的级别“trace”与“info”的行为方式相同。到目前为止,我还没有取得任何成功。我需要像这样的东西 感谢你的帮助。

    • 有没有办法只进行一次xslt转换并将输出呈现为pdf、png、svg文件? 在上面的例子中,为了生成PDF然后生成PNG,我必须创建一个具有不同mime类型的新Fop实例,然后再次调用xslfoTransformer.transform()。 这意味着我将有两次转换,但我想知道是否有一种方法可以运行一次转换,然后将输出渲染为不同的格式?(自定义渲染器?) 或者有什么建议可以加快渲染速度,因为我还需