ラベルと 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()
);
しかし、まだ正しく動作していません。
私はこれを間違っているように感じますが、正しく行う方法がわかりません。このようなフォーム上のコントロールを再スケーリングする適切な方法は何ですか? 私が探している結果を達成するためのより良い方法はありますか?