我正在开发一个JavaFX应用程序,其布局是从外部数据结构生成的,包含以下内容:
显示知道其宽高比(高度作为宽度的依赖项)的组件 两种类型的结构组件 在页面上显示所有子元素,并使每个子元素占据所需的垂直空间 在页面上向下显示所有子元素,使用全部宽度并占据所需的垂直空间
但我发现显示结果与我的预期不符。我创建了一个简化的案例来演示问题。
下面是代码,问题在于v3没有被显示出来,我无法弄清楚原因。我想这可能与VBox和HBox的某些方面有关,但我还没理解透彻。
非常感谢任何帮助或想法。提前致谢!
显示知道其宽高比(高度作为宽度的依赖项)的组件 两种类型的结构组件 在页面上显示所有子元素,并使每个子元素占据所需的垂直空间 在页面上向下显示所有子元素,使用全部宽度并占据所需的垂直空间
但我发现显示结果与我的预期不符。我创建了一个简化的案例来演示问题。
下面是代码,问题在于v3没有被显示出来,我无法弄清楚原因。我想这可能与VBox和HBox的某些方面有关,但我还没理解透彻。
非常感谢任何帮助或想法。提前致谢!
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);
}
}
}
mainStage.show()
之后)使用root.requestLayout()
。或者尝试使用prefWidthProperty
来绑定而不是V|HBoxes的widthProperty
。 - Uluk Biyroot.requestLayout()
可以修复布局 - 但为什么需要这样做呢?对我来说,这似乎是一种hack,因此我想知道是否有避免调用的方法。使用predWidthProperty
而不是widthProperty
会导致什么都不显示。 - hcarver