如何调整多边形的大小?

时间:2015-11-30 00:20:10

标签: java javafx

我的任务是制作一个笑脸,当窗户调整大小时,适合边框。我可以得到所有其他形状,但是当我尝试使用多边形时,我不知道如何做到这一点。因此,如果我可以帮助您从javafx.node.shape.Shape包中调整多边形的大小,那就太棒了。

一如既往地感谢您的及时帮助,如果我违反了许多规则,我感到非常抱歉。

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.layout.Pane;
    import javafx.scene.paint.Color;
    import javafx.scene.shape.Circle;
    import javafx.stage.Stage;
    import javafx.scene.shape.Polygon;
    import javafx.scene.shape.Ellipse;
    import javafx.scene.shape.*;

    public class smiley extends Application{
      @Override // Override the start method in the Application class
      public void start(Stage primaryStage) {
        Pane pane = new Pane();
        // Create a circle and set its properties
        Circle circle = new Circle();
        circle.centerXProperty().bind(pane.widthProperty().divide(2));
        circle.centerYProperty().bind(pane.heightProperty().divide(2)); 
        circle.setRadius(50);
        circle.setStroke(Color.BLACK);
        circle.setFill(null);

        Polygon nose = new Polygon();
        nose.getPoints().addAll(new Double[]{ 100.0, 90.0, 90.0, 120.0, 110.0, 120.0 });
        nose.setStroke(Color.BLACK);
        nose.setFill(null);

        Ellipse leftEye = new Ellipse();
        leftEye.centerXProperty().bind(pane.widthProperty().divide(2).add(20));
        leftEye.centerYProperty().bind(pane.heightProperty().divide(2).subtract(20));
        leftEye.setRadiusX(15.0f);
        leftEye.setRadiusY(10.0f);
        leftEye.setStroke(Color.BLACK);
        leftEye.setFill(null);

        Ellipse rightEye = new Ellipse();
        rightEye.centerXProperty().bind(pane.widthProperty().divide(2).subtract(20));
        rightEye.centerYProperty().bind(pane.heightProperty().divide(2).subtract(20));
        rightEye.setRadiusX(15.0f);
        rightEye.setRadiusY(10.0f);
        rightEye.setStroke(Color.BLACK);
        rightEye.setFill(null);

        Circle leftPupil = new Circle();
        leftPupil.centerXProperty().bind(pane.widthProperty().divide(2).add(20));
        leftPupil.centerYProperty().bind(pane.heightProperty().divide(2).subtract(20));
        leftPupil.setRadius(7);
        leftPupil.setStroke(Color.BLACK);

        Circle rightPupil = new Circle();
        rightPupil.centerXProperty().bind(pane.widthProperty().divide(2).subtract(20));
        rightPupil.centerYProperty().bind(pane.heightProperty().divide(2).subtract(20));
        rightPupil.setRadius(7);
        rightPupil.setStroke(Color.BLACK);

        Arc smile = new Arc();
        smile.centerXProperty().bind(pane.widthProperty().divide(2));
        smile.centerYProperty().bind(pane.heightProperty().divide(2).add(20));
        smile.setRadiusX(25.0f);
        smile.setRadiusY(10.0f);
        smile.setStartAngle(180.0f);
        smile.setLength(180.0f);
        smile.setType(ArcType.OPEN);
        smile.setFill(null);
        smile.setStroke(Color.BLACK);

        pane.getChildren().add(circle);
        pane.getChildren().add(nose);
        pane.getChildren().add(leftEye);
        pane.getChildren().add(rightEye);
        pane.getChildren().add(leftPupil);
        pane.getChildren().add(rightPupil);
        pane.getChildren().add(smile);

        // Create a scene and place it in the stage
        Scene scene = new Scene(pane, 200, 200);
        primaryStage.setTitle("Assignment 14"); // Set the stage title
        primaryStage.setScene(scene); // Place the scene in the stage
        primaryStage.show(); // Display the stage


      }
    } 

1 个答案:

答案 0 :(得分:1)

从您的代码中,您似乎并不是在谈论笑脸在舞台上成长/缩小,而是在舞台调整时保持在舞台的中心位置。除了你的多边形鼻子外,你所有的笑脸都是这样做的。鼻子没有这样做的原因是你使用固定在场景根部的窗格的坐标系来定义带有点的多边形。 如果你真的希望脸部调整大小而不仅仅是移动,你的方法将涉及相同概念的略微不同的应用,特别是方法2 的那些。

我可以想到两种方法来实现你的鼻子与其余部分一起移动的目标,我会按照偏好的顺序列出我的方法:

方法1:专门针对脸部的窗格。 不是让笑脸的每个子片定义其相对于整个场景的位置,而是将笑脸的所有片段定义为相对于窗格的位置,该窗格刚好足以容纳笑脸的外圈。 。然后定义此窗格相对于场景根窗格的位置。

我更喜欢这种方法的原因是它有更好的封装。例如 - 如果您以后决定要让整个笑脸在屏幕上移动,您可以定义代码来移动容器窗格而不是所有单个部分。同样,添加新片段只需要在该窗格的坐标系中工作,因此您不必考虑确保它在整个场景中适当移动。

用于仅将脸部圆圈添加到此类smileyPane的示例代码段。多边形和其余部分留作练习: - )

    //This pane is the root of the scene, and stretches with the
    //stage. It will hold the smileyPane.
    Pane rootPane = new Pane();

    double smileyRadius = 50.0;

    //This pane is just big enough to hold the outer circle of
    //the smiley face. It holds all the individual pieces that 
    //make up the face.
    Pane smileyPane = new Pane();
    rootPane.widthProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            double smileyPaneStartX = (newValue.doubleValue()/2)-(smileyRadius); 
            smileyPane.setLayoutX(smileyPaneStartX);
        }
    });

    rootPane.heightProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            double smileyPaneStartY = (newValue.doubleValue()/2)-(smileyRadius); 
            smileyPane.setLayoutY(smileyPaneStartY);
        }
    });

方法2:用于重新计算鼻子位置的外部窗格尺寸的监听器。基本上,只要外部窗格的大小发生变化,就会定义一些要运行的代码,以便你可以重新计算鼻子/多边形的正确位置。

  Polygon nose = new Polygon();
  nose.setStroke(Color.BLACK);
  nose.setFill(null);

  //Add initial nose position points
  nose.getPoints().addAll(new Double[]{ 100.0, 90.0, 90.0, 120.0, 110.0, 120.0 });
  pane.widthProperty().addListener(new ChangeListener<Number>(){
    @Override
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
        //The overall pane width changed. Recalculate the position of nose points
        //Actual position calculation left as exercise.
    }
  });

  //Similar thing needs to be done with height. Left as exercise.

我留下了一些内容,故意省略整个解决方案。这显然是功课。这应该足以让你开始,但希望你自己通过填写作品来学习一些东西!