Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:在场景/舞台/窗口上缩放控件的正确方法是什么?_Java_Javafx_Javafx 8_Scene_Rescale - Fatal编程技术网

JavaFX:在场景/舞台/窗口上缩放控件的正确方法是什么?

JavaFX:在场景/舞台/窗口上缩放控件的正确方法是什么?,java,javafx,javafx-8,scene,rescale,Java,Javafx,Javafx 8,Scene,Rescale,我有一个简单的控件,它只是一个标签和一个VBox。目的是通知用户程序中的内容。我想这样做,标签将与场景适当缩放。我有完成这项任务的方法(无论如何,我认为): 我将侦听器添加到Initialize方法中的控件宽度和高度属性: @Override public void initialize(URL location, ResourceBundle resources){ this.widthProperty().addListener(( ObservableValue&l

我有一个简单的控件,它只是一个标签和一个VBox。目的是通知用户程序中的内容。我想这样做,标签将与场景适当缩放。我有完成这项任务的方法(无论如何,我认为):

我将侦听器添加到Initialize方法中的控件宽度和高度属性:

@Override public void initialize(URL location, ResourceBundle resources){
    this.widthProperty().addListener((
        ObservableValue<? extends Number> obsV, Number oldV, Number newV
    ) -> this.reScaleX());
    this.heightProperty().addListener((
        ObservableValue<? extends Number> obsV, Number oldV, Number newV
    ) -> this.reScaleY());
}
@覆盖公共void初始化(URL位置、ResourceBundle资源){
此.widthProperty().addListener((

ObservalEvalue如果缩放标签,它将对其父标签产生布局效果,再次导致宽度/高度属性更改,触发致命的布局递归

我不是100%确定你想要实现什么

a) 将文本以某种方式置于可用空间的中心:

void testLabelPlains1(VBox box) {
    box.setFillWidth(true);

    Label first = new Label("first");
    first.setAlignment(Pos.CENTER);
    first.setMaxWidth(Double.MAX_VALUE);
    first.setMaxHeight(Double.MAX_VALUE);
    VBox.setVgrow(first, Priority.ALWAYS);

    box.getChildren().addAll(first);
}
b) 在可调整大小的标签内缩放字体大小:

void testLabelPlains2(VBox box) {
    box.setFillWidth(true);

    Label first = new Label("first");
    first.setAlignment(Pos.CENTER);
    first.setMaxWidth(Double.MAX_VALUE);
    first.setMaxHeight(Double.MAX_VALUE);
    VBox.setVgrow(first, Priority.ALWAYS);

    first.heightProperty().addListener(p -> {
        first.setFont(first.getFont().font(first.getHeight()*0.7));
    });

    box.getChildren().addAll(first);
}
c) 真正在X/Y方向上线性缩放文本

void testLabelPlains3(VBox box) {        
    Text first = new Text("first");

    box.heightProperty().addListener(p -> {
        first.setScaleY(0.8*box.getHeight()/20);
        first.setTranslateY(box.getHeight()/2);
    });
    box.widthProperty().addListener(p -> {
        first.setScaleX(0.8*box.getWidth()/30);
        first.setTranslateX(box.getWidth()/2);
    });

    box.getChildren().addAll(first);
}

…当然,硬编码数字必须从文本的实际布局大小派生。

如果缩放标签,它将对其父级产生布局效果,再次导致宽度/高度属性更改,触发致命的布局递归

我不是100%确定你想要实现什么

a) 将文本以某种方式置于可用空间的中心:

void testLabelPlains1(VBox box) {
    box.setFillWidth(true);

    Label first = new Label("first");
    first.setAlignment(Pos.CENTER);
    first.setMaxWidth(Double.MAX_VALUE);
    first.setMaxHeight(Double.MAX_VALUE);
    VBox.setVgrow(first, Priority.ALWAYS);

    box.getChildren().addAll(first);
}
b) 在可调整大小的标签内缩放字体大小:

void testLabelPlains2(VBox box) {
    box.setFillWidth(true);

    Label first = new Label("first");
    first.setAlignment(Pos.CENTER);
    first.setMaxWidth(Double.MAX_VALUE);
    first.setMaxHeight(Double.MAX_VALUE);
    VBox.setVgrow(first, Priority.ALWAYS);

    first.heightProperty().addListener(p -> {
        first.setFont(first.getFont().font(first.getHeight()*0.7));
    });

    box.getChildren().addAll(first);
}
c) 真正在X/Y方向上线性缩放文本

void testLabelPlains3(VBox box) {        
    Text first = new Text("first");

    box.heightProperty().addListener(p -> {
        first.setScaleY(0.8*box.getHeight()/20);
        first.setTranslateY(box.getHeight()/2);
    });
    box.widthProperty().addListener(p -> {
        first.setScaleX(0.8*box.getWidth()/30);
        first.setTranslateX(box.getWidth()/2);
    });

    box.getChildren().addAll(first);
}

…当然,硬编码的数字必须从文本的实际布局大小派生出来。

好的,所以我对这个问题的解决方案有两个方面:

1(最关键):我总是忘记要缩放控件,其大小必须是相对静态的:也就是说,不要将最大宽度/高度设置为大数字。另外,不要允许控件垂直或水平增长。这是我的第一个错误(也是最常见和最令人沮丧的错误)

2:绑定scaleX和scaleY属性:这来自于我最近对属性知识的了解。有很多方法可以实现scale方法,但这对我来说是最干净的

this.Message.scaleXProperty().bind(Bindings.createDoubleBinding(() -> {
    return (this.getWidth() - 40.0) / this.Message.getWidth();
}, this.widthProperty())
); this.Message.scaleYProperty().bind(Bindings.createDoubleBinding(() -> {
    return (this.getHeight() - 40.0) / this.Message.getHeight();
}, this.heightProperty()));

所以在回顾中:1:要缩放的控件的大小必须是静态的。2:绑定控件scaleX和scaleY属性。phew。

好的,所以我对这个问题的解决方案是双重的:

1(最关键):我总是忘记要缩放控件,其大小必须是相对静态的:也就是说,不要将最大宽度/高度设置为大数字。另外,不要允许控件垂直或水平增长。这是我的第一个错误(也是最常见和最令人沮丧的错误)

2:绑定scaleX和scaleY属性:这来自于我最近对属性知识的了解。有很多方法可以实现scale方法,但这对我来说是最干净的

this.Message.scaleXProperty().bind(Bindings.createDoubleBinding(() -> {
    return (this.getWidth() - 40.0) / this.Message.getWidth();
}, this.widthProperty())
); this.Message.scaleYProperty().bind(Bindings.createDoubleBinding(() -> {
    return (this.getHeight() - 40.0) / this.Message.getHeight();
}, this.heightProperty()));

因此在回顾中:1:要缩放的控件的大小必须是静态的。2:绑定控件scaleX和scaleY属性。phew。

请参见相关:,并参见相关:,和C。当控件更改大小时,我希望标签随它更改大小。A和B不接近。C.当控件更改大小时,我希望标签随它更改大小。A和B不是clo东南方。