1

ラベルと 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()
    ); 

しかし、まだ正しく動作していません。

私はこれを間違っているように感じますが、正しく行う方法がわかりません。このようなフォーム上のコントロールを再スケーリングする適切な方法は何ですか? 私が探している結果を達成するためのより良い方法はありますか?

4

2 に答える 2

1

さて、問題に対する私の解決策は2つあります。

1 (最も重要): コントロールをスケーリングするには、サイズが比較的静的でなければならないことを忘れがちです。つまり、最大幅/高さを大きな数値に設定しないでください。また、コントロールが垂直方向または水平方向に大きくならないようにしてください。これは私の最初の (そして最も一般的で苛立たしい間違いです)。

2: scaleX と scaleY のプロパティをバインドします。これは、プロパティの知識に関する比較的最近の増加から来ています。スケール メソッドを実行するには多くの方法がありますが、これが最もクリーンに感じられます。

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 プロパティをバインドします。ふぅ

于 2014-11-06T13:39:05.733 に答える