Layout JavaFX VBox和HBox布局
我正在开发一个Layout JavaFX VBox和HBox布局,layout,javafx-2,Layout,Javafx 2,我正在开发一个JavaFX应用程序,它有一个从外部数据结构生成的布局,由 显示知道其自身纵横比的构件(高度取决于宽度) 2种类型的结构构件 在页面上以相等的宽度显示所有子项,每个子项根据需要显示尽可能多的垂直空间 使用全宽显示页面下方的所有子项,并根据需要占用尽可能多的垂直空间 但我发现事情并不像我预期的那样。我做了一个简单的例子来说明这个问题 下面是代码,问题是v3无法显示,我一生都无法找出原因。我想VBoxes和HBoxes的某些方面我还没有理解 我非常感谢任何帮助或想法。提前谢谢
JavaFX
应用程序,它有一个从外部数据结构生成的布局,由
- 显示知道其自身纵横比的构件(高度取决于宽度)
- 2种类型的结构构件
- 在页面上以相等的宽度显示所有子项,每个子项根据需要显示尽可能多的垂直空间
- 使用全宽显示页面下方的所有子项,并根据需要占用尽可能多的垂直空间
v3
无法显示,我一生都无法找出原因。我想VBox
es和HBox
es的某些方面我还没有理解
我非常感谢任何帮助或想法。提前谢谢
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import java.util.Random;
public class Test extends Application {
static Random rand = new Random();
public static void main(String args[]) {
Application.launch("something");
}
@Override
public void start(Stage mainStage) throws Exception {
testVBoxes(mainStage);
}
private void testVBoxes(Stage mainStage) {
VBox root = new VBox();
Scene one = new Scene(root, 800, 600, Color.WHITE);
FixedAspectRatioH h1 = new FixedAspectRatioH();
FixedAspectRatioH h2 = new FixedAspectRatioH();
FixedAspectRatioH h3 = new FixedAspectRatioH();
FixedAspectRatioV v1 = new FixedAspectRatioV();
FixedAspectRatioV v2 = new FixedAspectRatioV();
FixedAspectRatioV v3 = new FixedAspectRatioV();
h1.prefWidthProperty().bind(root.widthProperty());
h2.add(v2);
v1.add(h3);
v1.add(h2);
h1.add(v1);
h1.add(v3);
root.getChildren().add(h1);
mainStage.setScene(one);
mainStage.show();
}
private class FixedAspectRatioV extends VBox {
public FixedAspectRatioV() {
Rectangle r = new Rectangle();
r.setFill(Color.rgb(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)));
r.widthProperty().bind(widthProperty());
r.heightProperty().bind(r.widthProperty().divide(3));
getChildren().add(r);
}
public void add(Region n) {
n.prefWidthProperty().bind(widthProperty());
getChildren().add(n);
}
}
private class FixedAspectRatioH extends HBox {
public FixedAspectRatioH() {
Rectangle r = new Rectangle();
r.setFill(Color.rgb(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)));
r.widthProperty().bind(widthProperty().divide(4));
r.heightProperty().bind(r.widthProperty());
getChildren().add(r);
}
public void add(Region n) {
HBox.setHgrow(n, Priority.ALWAYS);
getChildren().add(n);
}
}
}
已经两年了,但解决办法是你忘了
Node.setPrefSize(width,height);
并将其添加到构造函数
Hbox.setFillHeight(true)代码>不清楚您对该应用程序的想法,但似乎您在布局方面遇到了问题。在显示后台之后(在mainStage.show()之后)尝试root.requestLayout()
。或者尝试使用prefWidthProperty
进行绑定,而不是使用V|HBoxes的widthProperty
。调用root.requestLayout()
可以修复布局,但为什么需要这样做?在我看来,这就像是一个黑客,所以我想知道是否有办法避免这个电话。使用predWidthProperty
而不是widthProperty
不会显示任何内容。噢,哇,感谢您找到并回答此问题。我无法检查它是否正确,所以我会接受它,除非其他人说它不起作用。