gpt4 book ai didi

java - 如何让 Vbox 使用整个空间

转载 作者:行者123 更新时间:2023-12-01 11:17:47 25 4
gpt4 key购买 nike

这是javafx8,我必须在这里写下,因为我没有足够的代表来使用该标签。

简单的例子:

public class Test extends Application
{
public static void main(String args[]) throws Exception { launch(args); }

private Canvas canvas;

@Override
public void start(Stage primaryStage)
{
VBox box = new VBox();

Button dummyButton = new Button("some text");
canvas = new Canvas();
canvas.heightProperty().addListener(observable -> draw());
canvas.widthProperty().addListener(observable -> draw());

VBox.setVgrow(canvas, Priority.ALWAYS);

box.getChildren().addAll(dummyButton, canvas);

Scene scene = new Scene(box, 1300, 800);
primaryStage.setScene(scene);
primaryStage.show();
}

private void draw()
{
final double width = canvas.getWidth();
final double height = canvas.getHeight();
System.out.println("w, h: " + width + "; " + height);
final GraphicsContext gc = canvas.getGraphicsContext2D();
gc.setFill(Color.GREENYELLOW);
gc.fillRect(0, 0, width, height);
}
}

我可能误读了 documentation of vbox ,在底部它说

For example, if a vbox needs the ListView to be allocated all extra space

然后执行 VBox.grow 操作,就像我在示例中所做的那样。但 Canvas 永远不会改变他的大小。它的宽度和高度始终为 0,而我预计 Canvas 会随着我调整窗口大小而增大和缩小。

如何让我的 Canvas (我猜还有我的 vbox)使用整个可用的垂直空间。

请不要建议使用初级阶段,在我的实际应用程序中,我与初级阶段相距很多层,中间还有许多其他元素。初级阶段只是为了有一个可运行的程序。

最佳答案

你的绘制方法有点困惑。

private void draw() {
final double width = canvas.getWidth();
final double height = canvas.getHeight();
System.out.println("w, h: " + width + "; " + height);
final GraphicsContext gc = canvas.getGraphicsContext2D();
gc.setFill(Color.GREENYELLOW);
gc.fillRect(0, 0, width, height);
}

如果我们查看您的方法,就会发现您所做的一些事情可能会导致问题。

但首先,正如您所注意到的,声明:

VBox.setVgrow(canvas, Priority.ALWAYS);

给你带来麻烦了。因此,让我们摆脱它并使用当前的结构。

如果我们只是将您的监听器从 Canvas 更改为框:

canvas.heightProperty().addListener(observable -> draw());
canvas.widthProperty().addListener(observable -> draw());

box.heightProperty().addListener(observable -> draw());
box.widthProperty().addListener(observable -> draw());

我们现在将随着您的 Vbox 大小的变化动态更新内容。这意味着当我们调整大小时,您的方法绘制将不会被调用,它以前没有这样做,所以这很好!

现在回到绘制方法。首先,您每次都要求 Canvas 宽度,而我们真正关心的是让 Canvas 与框匹配,所以让我们将其从 Canvas 更改为框(您现在将 Vbox 声明为字段)。

private void draw() {
final double width = box.getWidth();
final double height = box.getHeight();
System.out.println("w, h: " + width + "; " + height);
final GraphicsContext gc = canvas.getGraphicsContext2D();
gc.setFill(Color.GREENYELLOW);
gc.fillRect(0, 0, width, height);
}

但这仍然不能很好地工作。那是因为我们从不更新 Canvas 大小!因此,让我们添加一个 setWidth 和一个 setHeight

private void draw() {
final double width = box.getWidth();
final double height = box.getHeight();
canvas.setWidth(width);
canvas.setHeight(height);
System.out.println("w, h: " + width + "; " + height);
final GraphicsContext gc = canvas.getGraphicsContext2D();
gc.setFill(Color.GREENYELLOW);
gc.fillRect(0, 0, width, height);
}

这样,我们会注意到一切看起来都相当不错,但有一个异常(exception)。该按钮现在挡住了屏幕顶部,因此您实际上无法填充该顶部部分。这是因为按钮首先绘制到屏幕上并获得优先级(如果我们通过不同的 add 方法调用将其切换为添加到索引 1 处,我们会看到按钮消失)。我现在想不出解决这个问题的方法,但希望这能解决您的部分问题!

关于java - 如何让 Vbox 使用整个空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590853/

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