我想通过包装我的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);
}
}
以下是结果视图。
答案 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);
}
}