当前位置: 首页 > 知识库问答 >
问题:

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

都乐逸
2023-03-14
public void reScaleX(){
    this.Message.setScaleX(( //Message is the Label Variables name.
        this.getWidth() - 40 //40 is the 20 + 20 padding given to the control.
        ) / this.Message.getBoundsInLocal().getWidth()
    );
}

public void reScaleY(){
    this.Message.setScaleY((
        this.getHeight() - 40 //40 is the 20 + 20 padding given to the control.
        ) / this.Message.getBoundsInLocal().getHeight()
    );
}
@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());
}
    this.PreviewStage.widthProperty().addListener((
        ObservableValue<? extends Number> obsV, Number oldV, Number newV
    ) ->
        this.PreviewPlaque.reScaleX()
    ); this.PreviewStage.heightProperty().addListener((
        ObservableValue<? extends Number> obsV, Number oldV, Number newV
    ) ->
        this.PreviewPlaque.reScaleY()
    ); 

但它的行为仍然不正确。

我觉得我做错了,但我不知道如何做对。在这样的窗体上重新缩放控件的正确方法是什么?有没有更好的方法来达到我所期待的结果?

共有1个答案

李安歌
2023-03-14

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

我不是百分之百确定你想要实现什么。

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);
}
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);
}
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);
}
 类似资料:
  • 我一直试图从控制器打开一个新窗口以显示进度条: 请帮忙。没有例外,也没有错误。谢谢 编辑:我已经找到了它不显示的原因,这是因为在后面的代码中我有一个函数:阻止程序刷新我的场景和显示元素。是否有一种方法可以在后台或另一个线程中运行这一行(我以前从未使用过线程)再次感谢你的帮助。

  • 我想写一个包含以下类的游戏: 我希望所有这些课程都能在舞台上使用。首先,我启动startUp类,几秒钟后,我想删除startUp stackpane并更改场景(例如从fxml文件读取),但我是javafx中的noob。有什么想法吗?

  • 如何在场景的控件上循环?我尝试使用getChildrenUnmodifiable(),但它只返回第一级子级。

  • 当我调整窗口大小时,舞台以及包含的场景会正确调整大小,但是当我单击最大化按钮时,只有舞台被最大化,而不是里面的场景。更糟糕的是,没有手动更改场景高度和宽度的方法(这些是只读的)。我还尝试创建新场景并将旧场景的根元素放在里面,但后来我得到了一个例外,即2个场景不能具有相同的根元素。谢谢! 最小可再现示例: 我标记了单击“最大化”的时刻。谢谢

  • 我正在使用Javafx(没有使用FXML),我正在将阶段传递到a控制器中,以便在单击按钮时更改阶段上的场景。场景的变化是正确的,但是舞台和场景的尺寸增加了,它的尺寸增加了大约0.1(宽度),而高度有时也增加了(不是每次都增加)。 下面是正在使用的控制器。

  • 问题内容: 我们正在Windows中构建JavaFX应用程序,我们希望能够做一些事情来操纵我们的应用程序在Windows 7/8任务栏中的显示方式。这需要修改Windows变量,称为“ 应用程序用户模型ID ”。 我们已经通过使用JNA设法完全完成了我们在Swing中想要的工作,并且我们想在JavaFX中重复我们的解决方案。不幸的是,要做到这一点,我们需要能够为应用程序中的每个窗口检索(窗口句柄)