我在SceneBuilder中构建了一个布局,它有一个ScrollPane(在StackPane中),其中包含一个StackPane,其中包含一个包含ImageView的Group(对齐到中间左侧)。出于某种原因,无论我是使用Ctrl + P在SceneBuilder中预览还是在我的程序中运行,都会禁用水平滚动条。滚动条确实显示右侧有更多滚动到,但我无法滚动到它。它看起来像这样:
这是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和ALWAYS的水平滚动政策。
答案 0 :(得分:1)
你遇到了很多问题(最重要的是带有你的控件的HBox会覆盖你的ScrollPane,否则会截取ScrollPane):
preserveRatio="false"
而不是preserveRatio="true"
,否则图片可能不会增长到您提供的fitWidth(因为它可能首先达到fitHeight限制而不再增加宽度)。maxHeight="-Infinity"
(这将确保HBox的最大高度不会超过HBox的首选高度,否则HBox将拦截针对您的ScrollPane的鼠标点击)。要么是这个,要么为HBox设置pickOnBounds="false"
,这样即使它覆盖了ScrollPane,HBox也不会拦截ScrollPane的鼠标点击。 注意:调试布局大小,有时临时向区域添加背景或边框以查看其真实大小非常有用,例如style="-fx-background-color: red;"
。< / p>
此外,您可能不想将控件和图像放置在覆盖内容的StackPane中,而是使用VBox,而不是将其放在垂直而不是相互叠加的位置。