Полоса прокрутки JavaFX ScrollPane отключена

Я построил макет в SceneBuilder, который имеет ScrollPane (внутри StackPane), содержащий StackPane, содержащий группу (выровненную по левому центру), содержащую ImageView. По какой-то причине, независимо от того, просматриваю ли я в SceneBuilder с помощью Ctrl + P или запускаю в своей программе, горизонтальная полоса прокрутки отключена. Полоса прокрутки показывает, что вправо можно прокрутить еще больше, но я не могу прокрутить ее. Это выглядит так:

Отключенная полоса прокрутки

А вот и FXML:

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

<?import javafx.scene.Group?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.effect.DropShadow?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>


<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: white;" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1">
   <center>
      <StackPane prefHeight="150.0" prefWidth="200.0" style="-fx-background-color: white;" BorderPane.alignment="CENTER">
         <children>
            <ScrollPane id="scoreScrollPane" fitToHeight="true" hbarPolicy="ALWAYS" prefHeight="0.0" prefWidth="0.0" vbarPolicy="NEVER">
               <content>
                  <StackPane alignment="CENTER_LEFT">
                     <children>
                        <Group id="scoreGroup" StackPane.alignment="CENTER_LEFT">
                           <children>
                              <ImageView id="scoreImage" fitHeight="150.0" fitWidth="3000.0" pickOnBounds="true" preserveRatio="true">
                                 <image>
                                    <Image url="@Untitled.png" />
                                 </image>
                              </ImageView>
                           </children>
                        </Group>
                     </children>
                  </StackPane>
               </content>
            </ScrollPane>
            <HBox id="toolbar" alignment="TOP_CENTER" prefHeight="100.0" prefWidth="200.0" spacing="8.0">
               <children>
                  <Button id="recordButton" mnemonicParsing="false" text="Record" />
                  <Button id="stopButton" mnemonicParsing="false" text="Stop" />
               </children>
               <effect>
                  <DropShadow />
               </effect>
            </HBox>
         </children>
      </StackPane>
   </center>
</BorderPane>

Я пробовал политику горизонтальной прокрутки как AS_NEEDED, так и ВСЕГДА.


person voxoid    schedule 22.02.2016    source источник


Ответы (1)


У вас есть множество проблем (наиболее важным является то, что HBox с вашими элементами управления закрывает вашу ScrollPane, перехватывая то, что в противном случае перешло бы к ScrollPane):

  1. Установите preserveRatio="false" вместо preserveRatio="true" для вашего ImageView, в противном случае изображение может не вырасти до указанной вами ширины fitWidth (поскольку оно может сначала достичь предела fitHeight и больше не увеличивать ширину).
  2. Установите maxHeight="-Infinity" на свой HBox (это гарантирует, что максимальная высота HBox не превысит предпочтительную высоту для HBox, иначе HBox будет перехватывать щелчки мыши, предназначенные для вашей панели прокрутки). Либо это, либо установите pickOnBounds="false" для HBox, чтобы HBox не перехватывал щелчки мыши для ScrollPane, даже если он перекрывает ScrollPane.

Примечание. для отладки размеров макета иногда полезно временно добавить фон или границу области, чтобы увидеть ее истинный размер, например style="-fx-background-color: red;".

Кроме того, вместо того, чтобы размещать элементы управления и изображение в StackPane, которое перекрывает содержимое, возможно, вы захотите использовать вместо этого VBox, который вместо этого размещает элементы вертикально, а не друг над другом.

person jewelsea    schedule 22.02.2016
comment
Отлично, спасибо! Действительно, HBox закрывал полосу прокрутки. - person voxoid; 23.02.2016