这是我第一次在这里发布。我目前正在做一个作业,需要在JavaFX中创建奥林匹克环并使其在正确的地方相交。
这是应该的样子:
(来源:ashaw8 at ksuweb.kennesaw.edu)
当前,这些环相交,但是它们按照我创建对象的顺序占主导地位。蓝色在相交时会被黄色覆盖,黄色在相交时会被黑色覆盖,等等。正如您在奥林匹克环的图片中所见,黄色和蓝色第一次相交,黄色覆盖蓝色,而蓝色则覆盖黄色。时间。每个圆环相交一次都被另一个圆环覆盖,但是另一次被另一个圆环覆盖。
如果有人能指出正确的方向,使它们正确相交,那就太好了。
这是我到目前为止的代码:
package com.company;
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;
public class OlympicRings extends Application{
public void start(Stage primaryStage) {
//creates a new object, which will be the first circle
Circle circle1 = new Circle();
circle1.setCenterX(100); //sets the x coordinate for the center of the circle
circle1.setCenterY(100); //sets the y coordinate for the center of the circle
circle1.setRadius(50); //sets the radius of the circle to 50, makes the diameter 100
circle1.setStroke(Color.BLUE); //sets the color of the circle
circle1.setStrokeWidth(10); //sets the thickness of the lines
circle1.setFill(null); //sets the color of the inside of the circle, set to null to enable overlap
Circle circle2 = new Circle(); //creates additional circles
circle2.setCenterX(160);
circle2.setCenterY(150);
circle2.setRadius(50);
circle2.setStroke(Color.YELLOW);
circle2.setStrokeWidth(10);
circle2.setFill(null);
Circle circle3 = new Circle();
circle3.setCenterX(220);
circle3.setCenterY(100);
circle3.setRadius(50);
circle3.setStroke(Color.BLACK);
circle3.setStrokeWidth(10);
circle3.setFill(null);
Circle circle4 = new Circle();
circle4.setCenterX(280);
circle4.setCenterY(150);
circle4.setRadius(50);
circle4.setStroke(Color.GREEN);
circle4.setStrokeWidth(10);
circle4.setFill(null);
Circle circle5 = new Circle();
circle5.setCenterX(340);
circle5.setCenterY(100);
circle5.setRadius(50);
circle5.setStroke(Color.RED);
circle5.setStrokeWidth(10);
circle5.setFill(null);
//creating the pane that will display the circle
Pane pane = new Pane();
pane.getChildren().add(circle1); //each of these adds the various circles to the display of the pane
pane.getChildren().add(circle2);
pane.getChildren().add(circle3);
pane.getChildren().add(circle4);
pane.getChildren().add(circle5);
Scene scene1 = new Scene(pane, 440, 250); //creates the parameters of the pane
primaryStage.setTitle("Olympic Rings"); //names the pane
primaryStage.setScene(scene1); //picks what will go in the pane
primaryStage.show(); //shows the scene i've created
}
}
最佳答案
使用Circle
很难做到这一点。这将大量使用clip
属性,并且所生成的代码将不容易阅读。
相反,可以使用Arc
s绘制部分环。只需在添加覆盖部分之前将戒指的覆盖部分添加到父项即可。
前两个环的示例:
private static Arc createArc(double radius,
double centerX, double centerY,
double fromAngle, double toAngle,
Paint stroke,
double strokeWidth) {
Arc arc = new Arc(centerX, centerY, radius, radius, fromAngle, toAngle - fromAngle);
arc.setFill(null);
arc.setStroke(stroke);
arc.setStrokeWidth(strokeWidth);
return arc;
}
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane(
createArc(50, 60, 60, 90, 315, Color.BLUE, 10), // part of the blue ring containing part covered by yellow
createArc(50, 110, 110, 0, 360, Color.YELLOW, 10),
createArc(50, 60, 60, -45, 90, Color.BLUE, 10) // part covering the yellow ring
);
Scene scene = new Scene(pane);
primaryStage.setScene(scene);
primaryStage.show();
}