JavaFX ScrollPane [setPrefSize, setMinSize, setMaxSize] 不工作
JavaFX ScrollPane [ setPrefSize, setMinSize, setMaxSize ] not working
我正在编写带有 ScrollPane 的 GUI 应用程序,但在调整大小方面遇到了一些问题。我在以下示例中提取了基本代码:
import javafx.application.Application;
import javafx.geometry.Bounds;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.layout.VBox;
import javafx.scene.control.ScrollPane;
public class JavaFXExample extends Application {
final int width = 300;
final int height = 300;
@Override
public void start(Stage primaryStage) {
Button b = new Button("This should be at the bottom!");
//this vbox goes inside the scrollpane
VBox boxInScrollPane = new VBox(10);
boxInScrollPane.setAlignment(Pos.BOTTOM_CENTER);
boxInScrollPane.getChildren().add(b);
//main content
ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(boxInScrollPane);
scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
//Doesn't do anything!
scrollPane.setPrefSize(100, 100);
scrollPane.setMaxSize(100, 100);
scrollPane.setMinSize(100, 100);
Scene scene = new Scene(scrollPane, width, height);
primaryStage.setScene(scene);
primaryStage.show();
//set size of boxInScrollPane to be equal to the viewport
Bounds viewportBounds = scrollPane.getViewportBounds();
double innerWidth = viewportBounds.getMaxX() - viewportBounds.getMinX();
double innerHeight = viewportBounds.getMaxY() - viewportBounds.getMinY();
System.out.println(innerWidth + " " + innerHeight);
boxInScrollPane.setPrefSize(innerWidth, innerHeight);
}
public static void main(String[] args) {
launch(args);
}
}
所以我有一个 window,它包含一个 ScrollPane,它包含一个 VBox,它包含一个按钮。这里的示例是任意的,我将滚动窗格的大小调整为 300x300px window 中的 100x100px。重要的是,当我 运行 这段代码时,我得到一个填满整个 window 的滚动窗格!这是我的输出:
这是怎么回事?
解决方案:
Pane pane = new Pane(scrollPane);
Scene scene = new Scene(pane, width, height);
primaryStage.setScene(scene);
primaryStage.show();
来自场景构造函数文档:
Creates a Scene for a specific root Node with a specific size.
将 ScrollPane 设置为根节点将使其在构造函数中调整为给定大小,因此之前的设置将不起作用。
解决方案是制作一个可以调整大小的简单窗格,这样 ScrollPane 就会有自己的规则。
无论min/pref/max 大小如何,场景根的大小都会填满整个场景。如果您希望 ScrollPane
保持 100 像素宽和 100 像素高,请将其包装在另一个容器中(几乎任何容器都可以);然后将调整容器的大小,但 ScrollPane
将遵守其布局大小:
Scene scene = new Scene(new StackPane(scrollPane), width, height);
默认情况下 StackPane
将其内容居中,因此这会导致
我正在编写带有 ScrollPane 的 GUI 应用程序,但在调整大小方面遇到了一些问题。我在以下示例中提取了基本代码:
import javafx.application.Application;
import javafx.geometry.Bounds;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.layout.VBox;
import javafx.scene.control.ScrollPane;
public class JavaFXExample extends Application {
final int width = 300;
final int height = 300;
@Override
public void start(Stage primaryStage) {
Button b = new Button("This should be at the bottom!");
//this vbox goes inside the scrollpane
VBox boxInScrollPane = new VBox(10);
boxInScrollPane.setAlignment(Pos.BOTTOM_CENTER);
boxInScrollPane.getChildren().add(b);
//main content
ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(boxInScrollPane);
scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
//Doesn't do anything!
scrollPane.setPrefSize(100, 100);
scrollPane.setMaxSize(100, 100);
scrollPane.setMinSize(100, 100);
Scene scene = new Scene(scrollPane, width, height);
primaryStage.setScene(scene);
primaryStage.show();
//set size of boxInScrollPane to be equal to the viewport
Bounds viewportBounds = scrollPane.getViewportBounds();
double innerWidth = viewportBounds.getMaxX() - viewportBounds.getMinX();
double innerHeight = viewportBounds.getMaxY() - viewportBounds.getMinY();
System.out.println(innerWidth + " " + innerHeight);
boxInScrollPane.setPrefSize(innerWidth, innerHeight);
}
public static void main(String[] args) {
launch(args);
}
}
所以我有一个 window,它包含一个 ScrollPane,它包含一个 VBox,它包含一个按钮。这里的示例是任意的,我将滚动窗格的大小调整为 300x300px window 中的 100x100px。重要的是,当我 运行 这段代码时,我得到一个填满整个 window 的滚动窗格!这是我的输出:
这是怎么回事?
解决方案:
Pane pane = new Pane(scrollPane);
Scene scene = new Scene(pane, width, height);
primaryStage.setScene(scene);
primaryStage.show();
来自场景构造函数文档:
Creates a Scene for a specific root Node with a specific size.
将 ScrollPane 设置为根节点将使其在构造函数中调整为给定大小,因此之前的设置将不起作用。
解决方案是制作一个可以调整大小的简单窗格,这样 ScrollPane 就会有自己的规则。
无论min/pref/max 大小如何,场景根的大小都会填满整个场景。如果您希望 ScrollPane
保持 100 像素宽和 100 像素高,请将其包装在另一个容器中(几乎任何容器都可以);然后将调整容器的大小,但 ScrollPane
将遵守其布局大小:
Scene scene = new Scene(new StackPane(scrollPane), width, height);
默认情况下 StackPane
将其内容居中,因此这会导致