我有一个简单的控件,它只是一个标签和一个 VBox。目的是通知用户程序中的事物。我想做到这一点,以便标签可以正确地随场景缩放。我有完成这项任务的方法(我认为,无论如何):
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()
);
}
我在 Initialize 方法中为控件的 Width 和 Height 属性添加了一个侦听器:
@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()
);
但它的行为仍然不正确。
我觉得我做错了,但我不知道如何做对。在这样的表单上重新缩放控件的正确方法是什么?有没有更好的方法来实现我正在寻找的结果?