0

/にがありVBox、の(groupA) をラップする子(groupB)があります。groupA は画面に対して大きすぎるため、スケール変換を groupB に追加してサイズを小さくすると、完全に機能します。ただし、ウィンドウは依然として巨大であると認識しているように見え、ダイアログは画面の境界をはるかに超えて広がっています。スケールが適用された後、親の境界は変更されているように見えますが、レイアウトの境界は変更されていません。レイアウトに影響を与えるようにスケーリングするにはどうすればよいですか?DialogDialogPaneGroupGroupShapesNodeGroup

編集: BitBucket でホストされている Eclipse プロジェクトの問題を簡潔に説明しました: http://v.gd/0trUMv

トグルボタンをクリックして、大小を切り替えることができます。グループが追加される前に変換が適用されることに注意してください。大きな円に切り替えると、レイアウトが子ノードのサイズ全体を考慮していることを示します。問題は、子ノードのプロパティを変更せずにその動作をオーバーライドする方法です。望ましい動作は、レイアウトの境界が小さな円のみを包含するようにすることです。

2回目の編集:ここにインラインコードがあります。

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Shape;
import javafx.scene.transform.Scale;
import javafx.scene.transform.Transform;
import javafx.stage.Stage;

public class Demo extends Application {

    private Scene scene = null;
    private static final String mksml = "make small";
    private static final String mkbig = "make big";
    private static final Transform smallScale = new Scale(0.2, 0.2);

    @Override
    public void start(Stage primaryStage) throws Exception {
        Shape bigGraphic = new Circle(500);
        Group originalBigGroup = new Group(bigGraphic);
        Group transformedGroup = new Group(originalBigGroup);
        transformedGroup.getTransforms().add(smallScale);
        Button xformToggle = new Button(mkbig);
        xformToggle.setOnMouseClicked((MouseEvent mouseEvent) -> {
            switch(xformToggle.getText()) {
            case mkbig:
                transformedGroup.getTransforms().clear();
                xformToggle.setText(mksml);
                break;
            case mksml:
                transformedGroup.getTransforms().add(smallScale);
                xformToggle.setText(mkbig);
            }
        });
        VBox layout = new VBox(xformToggle, transformedGroup);
        scene = new Scene(layout);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}
4

1 に答える 1