gpt4 book ai didi

JavaFX - BorderPane/StackPane 在 child 改变后不调整大小

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:47:53 25 4
gpt4 key购买 nike

在 JavaFX BorderPane 中添加和删除内容时,我遇到了调整大小问题。在手动调整窗口大小之前,不会调整 BorderPane 内容的大小。我已经编写了一个小型测试应用程序来模拟这种行为。该应用程序构建一个 BorderPane,其中包含一个嵌入在 BorderPane 中心的 StackPane 中的矩形。 BorderPane 的底部有一个包含文本和分隔符的 VBox 和 HBox。有一个菜单项从 BorderPane 的底部移除内容(MoveText -> Right)并在 BorderPane 的右侧位置添加类似的内容。

当文本添加到 BorderPane 的右侧位置时,矩形与文本重叠。换句话说,BorderPane 中心的内容与 BorderPane 右侧的内容重叠。

我看到了以下链接 - https://stackoverflow.com/questions/5302197/javafx-bug-is-there-a-way-to-force-repaint-this-is-not-a-single-threading-pr调用 requestLayout 似乎没有帮助。我还尝试在图中的各个节点上调用 impl_updatePG 和 impl_transformsChanged。我从这个线程得到这个想法 - https://forums.oracle.com/forums/thread.jspa?threadID=2242083

public class BorderPaneExample extends Application
{
private BorderPane root;
private StackPane centerPane;

@Override
public void start(Stage primaryStage) throws Exception
{
root = new BorderPane();
root.setTop(getMenu());
root.setBottom(getBottomVBox());
centerPane = getCenterPane();
root.setCenter(centerPane);

Scene scene = new Scene(root, 900, 500);
primaryStage.setTitle("BorderPane Example");
primaryStage.setScene(scene);
primaryStage.show();
}

private MenuBar getMenu()
{
MenuBar menuBar = new MenuBar();

MenuItem rightMenuItem = new MenuItem("Right");
rightMenuItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
root.setRight(getRightHBox());
root.setBottom(null);
root.requestLayout();
}
});
MenuItem bottomMenuItem = new MenuItem("Bottom");
bottomMenuItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
root.setRight(null);
root.setBottom(getBottomVBox());
}
});

Menu menu = new Menu("Move text");
menu.getItems().add(rightMenuItem);
menu.getItems().add(bottomMenuItem);
menuBar.getMenus().addAll(menu);

return menuBar;
}

private HBox getRightHBox()
{
HBox hbox = new HBox();

VBox vbox = new VBox(50);
vbox.setPadding(new Insets(0, 20, 0, 20));
vbox.setAlignment(Pos.CENTER);

vbox.getChildren().addAll(new Text("Additional Info 1"),
new Text("Additional Info 2"), new Text("Additional Info 3"));
hbox.getChildren().addAll(new Separator(Orientation.VERTICAL), vbox);

return hbox;
}

private VBox getBottomVBox()
{
VBox vbox = new VBox();

HBox hbox = new HBox(20);
hbox.setPadding(new Insets(5));
hbox.setAlignment(Pos.CENTER);

hbox.getChildren().addAll(new Text("Footer Item 1")
, new Text("Footer Item 2"), new Text("Footer Item 3"));
vbox.getChildren().addAll(new Separator(), hbox);

return vbox;
}

private StackPane getCenterPane()
{
StackPane stackPane = new StackPane();
stackPane.setAlignment(Pos.CENTER);

final Rectangle rec = new Rectangle(200, 200);
rec.setFill(Color.DODGERBLUE);
rec.widthProperty().bind(stackPane.widthProperty().subtract(50));
rec.heightProperty().bind(stackPane.heightProperty().subtract(50));

stackPane.getChildren().addAll(rec);

return stackPane;
}

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

如有任何建议,我们将不胜感激。谢谢

最佳答案

为了得到答案:

StackPane 需要设置最小尺寸才能进行裁剪。因此,如果您明确地将 stackPane.setMinSize(0, 0); 添加到 getCenterPane() 方法,它应该可以解决您的问题。

所以您的 getCenterPane() 方法现在看起来像这样:

private StackPane getCenterPane()
{
StackPane stackPane = new StackPane();
stackPane.setMinSize(0, 0);
stackPane.setAlignment(Pos.CENTER);

final Rectangle rec = new Rectangle(200, 200);
rec.setFill(Color.DODGERBLUE);
rec.widthProperty().bind(stackPane.widthProperty().subtract(50));
rec.heightProperty().bind(stackPane.heightProperty().subtract(50));

stackPane.getChildren().addAll(rec);

return stackPane;
}

关于JavaFX - BorderPane/StackPane 在 child 改变后不调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16949178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com