在JavaFx中,如何通过ScrollPane包装Bor​​derPane

时间:2017-04-28 10:20:32

标签: java javafx

我想通过包装我的BorderPane来制作滚动。我试过这样,但它不起作用。我的问题是什么?

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Drawing Test");

        VBox content = new VBox(5);
        ScrollPane scroller = new ScrollPane(content);
        scroller.setFitToWidth(true);

        BorderPane root = new BorderPane();     
        initRects(root);

        content.getChildren().add(root);

        Scene scene = new Scene(new BorderPane(scroller, null, null, null, null), 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

    void initRects(BorderPane root){
         DrawRect(root, 0);
         DrawRect(root, 100);
         DrawRect(root, 200);
         DrawRect(root, 300);
    }

    void DrawRect(BorderPane root, double y){
        Rectangle rect = new Rectangle(50, 50 + y, 900, 50);
        rect.setFill(Color.DODGERBLUE);
        root.getChildren().add(rect);
    }
}

以下是结果视图。

enter image description here

1 个答案:

答案 0 :(得分:0)

BorderPane将通过查看位于顶部,右侧,底部,左侧,中心五个区域的节点来执行其布局计算(包括计算其想要/需要的大小)。

由于矩形只是直接添加到边框窗格的子节点列表中,并且根本没有由边框窗格直接布局,因此边框窗格不会报告任何所需的大小。因此,包裹它的滚动窗格不知道它需要包含滚动条。

如果要显示这些矩形,普通Pane是一个更好的容器(它们基本上管理自己的布局,因此您不需要管理子节点布局的窗格): / p>

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Drawing Test");

        VBox content = new VBox(5);
        ScrollPane scroller = new ScrollPane(content);
        scroller.setFitToWidth(true);

        Pane root = new Pane();     
        initRects(root);

        content.getChildren().add(root);

        Scene scene = new Scene(new BorderPane(scroller, null, null, null, null), 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

    void initRects(Pane root){
         DrawRect(root, 0);
         DrawRect(root, 100);
         DrawRect(root, 200);
         DrawRect(root, 300);
    }

    void DrawRect(Pane root, double y){
        Rectangle rect = new Rectangle(50, 50 + y, 900, 50);
        rect.setFill(Color.DODGERBLUE);
        root.getChildren().add(rect);
    }
}

现在生成垂直滚动条,这是此内容所必需的。

注意该行

scroller.setFitToWidth(true);

强制内容与滚动窗格的视口具有相同的宽度,因此它将有效地防止显示任何水平滚动条(在这种情况下,剪切包含的窗格)。如果你删除它,你也会看到水平滚动条(这是我怀疑你想要的):

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Drawing Test");

        VBox content = new VBox(5);
        ScrollPane scroller = new ScrollPane(content);
//        scroller.setFitToWidth(true);

        Pane root = new Pane();     
        initRects(root);

        content.getChildren().add(root);

        Scene scene = new Scene(new BorderPane(scroller, null, null, null, null), 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

    void initRects(Pane root){
         DrawRect(root, 0);
         DrawRect(root, 100);
         DrawRect(root, 200);
         DrawRect(root, 300);
    }

    void DrawRect(Pane root, double y){
        Rectangle rect = new Rectangle(50, 50 + y, 900, 50);
        rect.setFill(Color.DODGERBLUE);
        root.getChildren().add(rect);
    }
}

enter image description here