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

JavaFX Scene Builder在运行时向附加AnchorPane添加组件时展开ScrollPane区域

陈季
2023-03-14

我还没有找到关于这方面的信息,但我已经在场景构建器中创建了一个布局,并在空的滚动窗格中放置了一个AnchorPane,以行为单位添加了文本、滑块和标签,然后为用户添加了一个按钮,以添加上面的新条目。

基本上是一个典型的偏好启发UI,用户还可以添加新条目并指定他们自己的偏好值。

当按下此按钮时,出于测试目的,该按钮将创建一个新标签,将其添加到AnchorPane,并将其重新定位到AnchorPane外的Y位置,然后调整AnchorPane的大小,以便包含新标签。我遇到的问题是ScrollPane不能调整和扩展可滚动区域以适应新的AnchorPane高度,所以我不能向下滚动到新标签可见的地方。另一方面,在Scene Builder中,如果我调整AnchorPane的大小,使其大于ScrollPane,后者会动态调整可滚动区域,所以我不确定问题是什么。

任何帮助都很感激。

package main;
import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.TitledPane;
import javafx.stage.Stage;

public class Registration_Page extends Application {
    private Stage primaryStage;
    private TitledPane mainLayout;

    @Override
    public void start(Stage primaryStage) throws IOException {
        this.primaryStage = primaryStage;
        showMainView();
    }

    private void showMainView() throws IOException {
        FXMLLoader loader = new FXMLLoader(Registration_Page.class.getResource("resources/Registration_Page.fxml"));
        mainLayout = loader.load();
        Scene scene = new Scene(mainLayout);
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

}
package main;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.AnchorPane;


public class ButtonController { 

    @FXML
    private Button plus;    

    @FXML
    private AnchorPane prefValuesAnchorPane;

    @FXML
    private ScrollPane scrollPane;

    @FXML
    protected void plusAction(ActionEvent event) {
        Label lbl1 = new Label("Hello");
        prefValuesAnchorPane.getChildren().add(lbl1);
        lbl1.relocate(18, 250);
        System.out.println(prefValuesAnchorPane.getHeight());
        System.out.println(lbl1.getLayoutY());
        if (lbl1.getLayoutY() >= prefValuesAnchorPane.getHeight())
        {
            prefValuesAnchorPane.resize(prefValuesAnchorPane.getWidth(), lbl1.getLayoutY() + 3);

        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.Slider?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>

<TitledPane animated="false" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" text="User Registration" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="main.ButtonController">
  <content>
    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
         <children>
            <TextField layoutX="52.0" layoutY="79.0" />
            <Text layoutX="14.0" layoutY="96.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Name" />
            <Text layoutX="14.0" layoutY="130.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Preference Values">
               <font>
                  <Font size="14.0" />
               </font>
            </Text>
            <ScrollPane fx:id="scrollPane" layoutX="14.0" layoutY="137.0" prefHeight="223.0" prefWidth="332.0">
               <content>
                  <AnchorPane fx:id="prefValuesAnchorPane" minHeight="0.0" minWidth="0.0" prefHeight="217.0" prefWidth="329.0">
                     <children>
                        <Text layoutX="15.0" layoutY="30.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Val1:" />
                        <Slider blockIncrement="1.0" layoutX="115.0" layoutY="15.0" majorTickUnit="1.0" max="10.0" minorTickCount="0" prefWidth="140.0" showTickLabels="true" snapToPixel="false" snapToTicks="true" />
                        <Label layoutX="280.0" layoutY="12.0" text="0">
                           <font>
                              <Font name="System Bold" size="14.0" />
                           </font>
                        </Label>
                        <Text layoutX="15.0" layoutY="62.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Val2:" />
                        <Slider blockIncrement="1.0" layoutX="115.0" layoutY="50.0" majorTickUnit="1.0" max="10.0" minorTickCount="0" prefWidth="140.0" showTickLabels="true" snapToTicks="true" />
                        <Label layoutX="280.0" layoutY="48.0" text="0">
                           <font>
                              <Font name="System Bold" size="14.0" />
                           </font>
                        </Label>
                        <Text layoutX="15.0" layoutY="97.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Val3:" />
                        <Slider blockIncrement="1.0" layoutX="115.0" layoutY="85.0" majorTickUnit="1.0" max="10.0" minorTickCount="0" prefWidth="140.0" showTickLabels="true" snapToTicks="true" />
                        <Label layoutX="280.0" layoutY="82.0" text="0">
                           <font>
                              <Font name="System Bold" size="14.0" />
                           </font>
                        </Label>
                        <Text layoutX="15.0" layoutY="133.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Val4:" />
                        <Slider blockIncrement="1.0" layoutX="115.0" layoutY="120.0" majorTickUnit="1.0" max="10.0" minorTickCount="0" prefWidth="140.0" showTickLabels="true" snapToTicks="true" />
                        <Label layoutX="280.0" layoutY="118.0" text="0">
                           <font>
                              <Font name="System Bold" size="14.0" />
                           </font>
                        </Label>
                        <Button fx:id="plus" graphicTextGap="1.0" layoutX="289.0" layoutY="153.0" maxHeight="-Infinity" maxWidth="-Infinity" mnemonicParsing="false" onAction="#plusAction" prefHeight="0.0" prefWidth="30.0" text="+" textAlignment="CENTER" textOverrun="CENTER_ELLIPSIS" AnchorPane.topAnchor="153.0">
                           <font>
                              <Font name="System Bold" size="14.0" />
                           </font>
                        </Button>
                     </children>
                  </AnchorPane>
               </content>
            </ScrollPane>
            <Button layoutX="532.0" layoutY="335.0" mnemonicParsing="false" text="Next" />
         </children></AnchorPane>
  </content>
</TitledPane>

共有1个答案

廖弘伟
2023-03-14

解决方案是使用包含AnchorPane的ScrollPane(原样),对于添加的每个条目,创建AnchorPane或BorderPane或任何其他容器窗格(afaik),并向其中添加任何内容,而不是将按钮或标签等组件直接添加到附加到SP的原始AP上。

 类似资料:
  • 在运行时添加到当单击时。 我使用以下代码: 但是在中没有显示任何。

  • 问题内容: 我有一个和上。 在运行时添加到单击时。 我使用以下代码: 但没有显示任何在。 问题答案: 我看到您创建了一个名为: 但您永远不会将其添加到面板中。相反,您将没有文本的新内容添加到面板中: 当然,这将构造一个不可见的空标签。 添加类似后,还尝试在您的实例上调用和,如下所示: 这样,您可能还需要调用您的框架实例,以便调整大小以适合新组件。 另外,请不要使用/ 布局,这是非常糟糕的做法(除非

  • 我知道ApplicationContext扩展点,如ApplicationContext事件和BeanFactoryPostProcessor。 我手头的问题是,在创建了一些bean之后,我需要添加bean,我想这会丢弃BeanFactoryPostProcessor选项,因为在应用程序上下文开始注册bean之前会发生这种情况。 我尝试在上下文刷新后添加一个singletonBean:

  • 在java9之前,在运行时通过编程方式将外部jar添加到类路径中,每个人都使用: 现在使用java9我们遇到了问题: 在Java9中不再工作。在jdk9下,如何在运行时以编程方式向类路径添加外部jar?

  • 我希望能够添加一些额外的要求到自己的创建docker图像。我的策略是使用CMD命令从dockerfile构建映像,该命令将在运行时使用挂载的卷执行“pip install-r”命令。 这是我的DockerFile: 有了dockerfile,我构建了映像:

  • 当Java11排除了JavaFX作为最新版本的一部分时,我得到了以下错误。 那么如何在Java11中将JavaFX添加到Eclipse中呢?谢了。