java - 为什么我的 javafx 滚动 Pane 立即滚动到底部?

标签 java javafx scrollpane gridpane

我有一个不可调整大小的设置面板,它变得很拥挤,所以我决定将包含设置的网格 Pane 添加到滚动 Pane 中。问题是应用程序启动时滚动 Pane 从底部开始。奇怪的是我将 HValue 设置为 0,它应该从顶部开始。这是在场景生成器中显示它的 gif:https://gyazo.com/f10a1641b8357e4fc30cd180c0425dae 根本没有代码与滚动 Pane 交互,正如您所看到的,场景生成器预览窗口也有相同的问题,因此它与 FXML 有关。要重现它,您可以简单地使用下面共享的 fxml 自己设置一个 javafx 项目,然后运行它并查看滚动条如何跳到底部。 完整的 FXML 文件:https://pastebin.com/aS3Dn3pH 。 仅滚动 Pane 内容的片段:

 <AnchorPane fx:id="settingsPane" layoutY="86.0" prefHeight="381.0" prefWidth="380.0">
    <ImageView layoutX="84.0" layoutY="-28.0" pickOnBounds="true" preserveRatio="true">
        <Image url="@images/up.png" />
    </ImageView>
  <ScrollPane fx:id="settingsScrollPane" hbarPolicy="NEVER" pickOnBounds="false" prefWidth="480.0" stylesheets="@style.css" vvalue="1.0" AnchorPane.bottomAnchor="0.0" AnchorPane.topAnchor="0.0">
     <content>
          <GridPane hgap="10.0" maxHeight="-Infinity" prefWidth="480.0">
              <columnConstraints>
                  <ColumnConstraints halignment="LEFT" hgrow="SOMETIMES" minWidth="10.0" prefWidth="270.0" />
                  <ColumnConstraints halignment="RIGHT" hgrow="SOMETIMES" minWidth="10.0" prefWidth="270.0" />
              </columnConstraints>
              <rowConstraints>
                  <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" />
                  <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" vgrow="SOMETIMES" />
                  <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" vgrow="SOMETIMES" />
                  <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" vgrow="SOMETIMES" />
                  <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" vgrow="SOMETIMES" />
                  <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" vgrow="SOMETIMES" />
                  <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" vgrow="SOMETIMES" />
                  <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" vgrow="SOMETIMES" />
                  <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" vgrow="SOMETIMES" />
                  <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" vgrow="SOMETIMES" />
              <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" vgrow="SOMETIMES" />
              <RowConstraints maxHeight="-Infinity" minHeight="35.0" prefHeight="30.0" vgrow="SOMETIMES" />
              </rowConstraints>
              <padding>
                  <Insets bottom="20.0" left="30.0" right="30.0" top="20.0" />
              </padding>
              <Label text="%no_away" textFill="WHITE" GridPane.valignment="BOTTOM">
                  <font>
                      <Font size="16.0" />
                  </font>
              </Label>
              <Label alignment="TOP_LEFT" text="%no_away_message" textFill="#f2efef" wrapText="true" GridPane.rowIndex="1" GridPane.valignment="TOP">
                  <font>
                      <Font size="13.0" />
                  </font>
              </Label>
              <Label text="%auto_queue" textFill="WHITE" GridPane.rowIndex="2" GridPane.valignment="BOTTOM">
                  <font>
                      <Font size="16.0" />
                  </font>
              </Label>
              <Label text="%auto_queue_message" textFill="#f2efef" wrapText="true" GridPane.rowIndex="3" GridPane.valignment="TOP">
                  <font>
                      <Font size="13.0" />
                  </font>
              </Label>
              <Label text="%quick_replies" textFill="WHITE" GridPane.rowIndex="4" GridPane.valignment="BOTTOM">
                  <font>
                      <Font size="16.0" />
                  </font>
              </Label>
              <Label text="%quick_replies_message" textFill="#f2efef" wrapText="true" GridPane.rowIndex="5" GridPane.valignment="TOP">
                  <font>
                      <Font size="13.0" />
                  </font>
              </Label>
              <Separator opacity="0.33" prefHeight="1.0" prefWidth="307.0" GridPane.columnSpan="2" GridPane.rowIndex="10" />
              <JFXButton fx:id="craftKeyBtn" maxWidth="1.7976931348623157E308" onAction="#handleSettingsButtonPressed" prefHeight="31.0" prefWidth="180.0" style="-fx-background-color: #1e2328; -fx-border-color: d9ae50;" text="%craft_all_keys" textFill="#d9ae50" GridPane.halignment="CENTER" GridPane.hgrow="ALWAYS" GridPane.rowIndex="11" GridPane.valignment="CENTER">
                  <font>
                      <Font name="System Bold" size="11.0" />
                  </font>
              </JFXButton>
              <JFXButton fx:id="disenchantBtn" maxWidth="1.7976931348623157E308" onAction="#handleSettingsButtonPressed" prefHeight="31.0" prefWidth="180.0" ripplerFill="#1986b1" style="-fx-background-color: #1e2328; -fx-border-color: d9ae50;" text="%disenchant_champions" textFill="#d9ae50" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="11" GridPane.valignment="CENTER">
                  <font>
                      <Font name="System Bold" size="11.0" />
                  </font>
              </JFXButton>
              <JFXToggleButton fx:id="noAwayBtn" onAction="#handleToggleButtonPressed" prefHeight="60.0" prefWidth="120.0" size="11.0" text="On" textFill="#eda678" toggleColor="#eda678" toggleLineColor="#eba478e2" GridPane.columnIndex="1" GridPane.rowIndex="0" GridPane.rowSpan="2">
                  <font>
                      <Font size="13.0" />
                  </font>
              </JFXToggleButton>
              <JFXToggleButton fx:id="autoQueueBtn" onAction="#handleToggleButtonPressed" prefHeight="60.0" prefWidth="120.0" size="11.0" text="On" textFill="#eda678" toggleColor="#eda678" toggleLineColor="#eba478e2" GridPane.columnIndex="1" GridPane.rowIndex="2" GridPane.rowSpan="2">
                  <font>
                      <Font size="13.0" />
                  </font>
              </JFXToggleButton>
              <JFXToggleButton fx:id="quickReplyBtn" onAction="#handleToggleButtonPressed" prefHeight="60.0" prefWidth="120.0" size="11.0" text="On" textFill="#eda678" toggleColor="#eda678" toggleLineColor="#eba478e2" GridPane.columnIndex="1" GridPane.rowIndex="4" GridPane.rowSpan="2">
                  <font>
                      <Font size="13.0" />
                  </font>
              </JFXToggleButton>
              <Label text="%autoupdate_state" textFill="WHITE" GridPane.rowIndex="6" GridPane.valignment="BOTTOM">
                  <font>
                      <Font size="16.0" />
                  </font>
              </Label>
              <Label text="%autoupdate_message" textFill="#f2efef" wrapText="true" GridPane.rowIndex="7" GridPane.valignment="TOP">
                  <font>
                      <Font size="13.0" />
                  </font>
              </Label>
              <JFXToggleButton fx:id="autoUpdateBtn" onAction="#handleToggleButtonPressed" prefHeight="60.0" prefWidth="120.0" size="11.0" text="On" textFill="#eda678" toggleColor="#eda678" toggleLineColor="#eba478e2" GridPane.columnIndex="1" GridPane.rowIndex="6" GridPane.rowSpan="2">
                  <font>
                      <Font size="13.0" />
                  </font>
              </JFXToggleButton>
           <Label text="%force_english" textFill="WHITE" GridPane.rowIndex="8" GridPane.valignment="BOTTOM">
              <font>
                 <Font size="16.0" />
              </font>
           </Label>
           <Label text="%force_english_message" textFill="#f2efef" wrapText="true" GridPane.rowIndex="9" GridPane.valignment="TOP">
              <font>
                 <Font size="13.0" />
              </font>
           </Label>
           <JFXToggleButton fx:id="force_english_btn" onAction="#handleToggleButtonPressed" prefHeight="60.0" prefWidth="120.0" size="11.0" text="On" textFill="#eda678" toggleColor="#eda678" toggleLineColor="#eba478e2" GridPane.columnIndex="1" GridPane.rowIndex="8" GridPane.rowSpan="2">
              <font>
                 <Font size="13.0" />
              </font>
           </JFXToggleButton>
          </GridPane>
     </content>
  </ScrollPane>
</AnchorPane>

最佳答案

focusTraversable="false" 添加到网格 Pane 中的每个节点解决了该问题。 问题在于,它在启动时将注意力集中在底部的按钮上,从而将 slider 移动到那里。该解决方案只是简单地实现了这样,在没有用户输入的情况下,没有任何东西会被随机聚焦。

关于java - 为什么我的 javafx 滚动 Pane 立即滚动到底部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56869384/

相关文章:

java - 如何在 JavaFX GridPane 中添加日期标题

java - 如何使用 scrollPane JavaFX 显示大于屏幕的图像

java - 如何使用 Apache Kafka 在 Spring Boot 中使用和保存自定义类型列表?

java - 如何在 ActionListener 的 actionPerformed 中传递 for 循环索引 [Java]

JavaFX 8,带复选框的 ListView

JavaFX 和 Spring Boot - NPE

JavaFX Combobox 下拉菜单被截断屏幕

java - 如果出现任何类型的异常,重定向到错误 Controller ?

java - 如何将固定大小的 Canvas 包裹在 BorderPane 中的 ScrollPane 居中?

java - 如何正确设置 javafx 媒体播放器