将Shape类绑定到StackPane高度

时间:2014-12-02 14:25:40

标签: javafx javafx-2 javafx-8

场景:舞台包含一个场景。场景包含一个StackPane。 StackPane和Scene的高度和宽度绑定在一起。 StackPane包含一个Shape,它是Rectangle和Shape的联合。

问题 - 将Shape类绑定到StackPane的高度时遇到问题。如何在我的示例中绑定Shape类的特定部分或完整的Shape类?

要求 - 我有2项要求。

  1. 当我最大化舞台时,StackPane从此开始增加 高度和宽度绑定到Scene但Shape不会增加。一世 需要Shape'(smallShapebigRectangle)才能增加 就高度而言。
  2. 当我最大化舞台时,StackPane应该增加,只有更大的矩形高度应该增加,但不是另一个小矩形,即bigRectangle高度应该只增加。
  3. 以下是我的代码段

    package application;
    
    import javafx.application.Application;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.layout.StackPane;
    import javafx.scene.paint.Color;
    import javafx.scene.shape.Rectangle;
    import javafx.scene.shape.RectangleBuilder;
    import javafx.scene.shape.Shape;
    import javafx.stage.Stage;
    
    public class BindingShape extends Application {
    
        @Override
        public void start(Stage primaryStage) throws Exception {
    
            StackPane stackPane = new StackPane();
            stackPane.setPrefHeight(200);
            stackPane.setPrefWidth(200);
            stackPane.setStyle("-fx-background-color: BEIGE");
            Shape smallShape = RectangleBuilder.create()
                    .x(0)
                    .y(3)
                    .arcWidth(6)
                    .arcHeight(6)
                    .width(50) // allow overlap for union of tab and content rectangle
                    .height(50)
                    .build();
    
            Rectangle bigRectangle = RectangleBuilder.create()
                    .x(25)
                    .y(0)
                    .arcWidth(10)
                    .arcHeight(10)
                    .width(100)
                    .height(100)
                    .build();
            Shape unionShape = Shape.union(smallShape, bigRectangle);
            unionShape.setFill(Color.rgb(0, 0, 0, .50));
            unionShape.setStroke(Color.BLUE);
    
            Group shapeGroup = new Group();
            shapeGroup.getChildren().add(unionShape);
            stackPane.getChildren().add(shapeGroup);
    
            Group paneGroup = new Group();
            paneGroup.getChildren().add(stackPane);
    
            Scene scene = new Scene(paneGroup, 400, 400,Color.LIGHTSKYBLUE);
            stackPane.prefHeightProperty().bind(scene.heightProperty().divide(2));
            stackPane.prefWidthProperty().bind(scene.widthProperty().divide(2));
            primaryStage.setScene(scene);
            primaryStage.show();
        }
        public static void main(String[] args) {
            launch(args);
        }
    
    }
    

    请让我知道解决方案。提前谢谢。

1 个答案:

答案 0 :(得分:1)

由于联合无法按部分调整大小,如果容器已按照以下方式调整大小,我将重建联合:

public class BindStackPaneToScene extends Application {
    Shape union;
    Shape makeShape(double w, double h) {
        Rectangle smallShape = new Rectangle(0, 3, 50, 50);
        smallShape.setArcHeight(6);
        smallShape.setArcWidth(6);

        Rectangle bigRectangle = new Rectangle(25, 3, w/2, h/2);
        bigRectangle.setArcHeight(10);
        bigRectangle.setArcWidth(10);

        Shape unionShape = Shape.union(smallShape, bigRectangle);
        unionShape.setFill(Color.rgb(0, 0, 0, .50));
        unionShape.setStroke(Color.BLUE);

        return unionShape;
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        StackPane stackPane = new StackPane();
        stackPane.setPrefHeight(200);
        stackPane.setPrefWidth(200);
        stackPane.setStyle("-fx-background-color: BEIGE");

        union = makeShape(200,200);

        Group shapeGroup = new Group();
        shapeGroup.getChildren().add(union);
        stackPane.getChildren().add(shapeGroup);

        stackPane.heightProperty().addListener((p, o, n) -> {
            if (union != null) shapeGroup.getChildren().remove(union);
            union = makeShape(stackPane.getWidth(),  n.doubleValue());
            shapeGroup.getChildren().add(union);
        });

        Group paneGroup = new Group();
        paneGroup.getChildren().add(stackPane);

        Scene scene = new Scene(paneGroup, 400, 400,Color.LIGHTSKYBLUE);
        stackPane.prefHeightProperty().bind(scene.heightProperty().divide(1));
        stackPane.prefWidthProperty().bind(scene.widthProperty().divide(1));
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }

}