public class MultipleFaces extends Application
1: import javafx.application.Application;
2: import javafx.scene.canvas.Canvas;
3: import javafx.scene.Scene;
4: import javafx.scene.Group;
5: import javafx.stage.Stage;
6: import javafx.scene.canvas.GraphicsContext;
7: import javafx.scene.shape.ArcType;
8: import javafx.scene.paint.Color;
9: import javafx.scene.text.Font;
11: public class MultipleFaces extends Application
12: {
13: public static final int WINDOW_WIDTH = 450;
14: public static final int WINDOW_HEIGHT = 300;
16: public static final int FACE_DIAMETER = 50;
17: public static final int X_FACE0 = 10;
18: public static final int Y_FACE0 = 5;
20: public static final int EYE_WIDTH = 5;
21: public static final int EYE_HEIGHT = 10;
22: public static final int X_RIGHT_EYE0 = 20;
23: public static final int Y_RIGHT_EYE0 = 15;
24: public static final int X_LEFT_EYE0 = 45;
25: public static final int Y_LEFT_EYE0 = Y_RIGHT_EYE0;
27: public static final int NOSE_DIAMETER = 5;
28: public static final int X_NOSE0 = 32;
29: public static final int Y_NOSE0 = 25;
31: public static final int MOUTH_WIDTH = 30;
32: public static final int MOUTH_HEIGHT0 = 0;
33: public static final int X_MOUTH0 = 20;
34: public static final int Y_MOUTH0 = 35;
35: public static final int MOUTH_START_ANGLE = 180;
36: public static final int MOUTH_EXTENT_ANGLE = 180;
38: public static void main(String[] args)
39: {
40: launch(args);
41: }
43: /**
44: gc is the drawing area. pos indicates the position of the
45: face. As pos increases, the face is drawn lower and further
46: to the right.
47: */
48: private void drawFaceSansMouth(GraphicsContext gc, int pos)
49: {
50: // Draw face oval
51: gc.setFill(Color.BLACK);
52: gc.strokeOval(X_FACE0 + 50 * pos, Y_FACE0 + 30 * pos,
53: FACE_DIAMETER, FACE_DIAMETER);
54: // Draw eyes
55: gc.setFill(Color.BLUE);
56: gc.fillOval(X_RIGHT_EYE0 + 50 * pos, Y_RIGHT_EYE0 + 30 * pos,
57: EYE_WIDTH, EYE_HEIGHT);
58: gc.fillOval(X_LEFT_EYE0 + 50 * pos, Y_LEFT_EYE0 + 30 * pos,
59: EYE_WIDTH, EYE_HEIGHT);
60: //Draw nose
61: gc.setFill(Color.BLACK);
62: gc.fillOval(X_NOSE0 + 50 * pos, Y_NOSE0 + 30 * pos,
63: NOSE_DIAMETER, NOSE_DIAMETER);
64: }
66: @Override
67: public void start(Stage primaryStage) throws Exception
68: {
69: Group root = new Group();
70: Scene scene = new Scene(root);
72: Canvas canvas = new Canvas(WINDOW_WIDTH, WINDOW_HEIGHT);
73: GraphicsContext gc = canvas.getGraphicsContext2D();
75: int i; //Want i to exist after the loop ends
77: for (i = 0; i <= 4; i++)
78: {//Draw one face:
79: if (i % 2 == 0)//if i is even
80: {//Make face yellow
81: gc.setFill(Color.YELLOW);
82: gc.fillOval(X_FACE0 + 50 * i, Y_FACE0 + 30 * i,
83: FACE_DIAMETER, FACE_DIAMETER);
84: }
85: drawFaceSansMouth(gc, i);
86: //Draw mouth:
87: gc.setFill(Color.RED);
88: gc.strokeArc(X_MOUTH0 + 50 * i, Y_MOUTH0 + 30 * i,
89: MOUTH_WIDTH, MOUTH_HEIGHT0 + 3 * i + 1,
90: MOUTH_START_ANGLE, MOUTH_EXTENT_ANGLE,
91: ArcType.OPEN);
92: }
93: //i is 5 when the previous loop ends
95: //Draw kissing face:
96: drawFaceSansMouth(gc, i);
97: //Draw mouth in shape of a kiss:
98: gc.setFill(Color.RED);
99: gc.fillOval(X_MOUTH0 + 50 * i + 10, Y_MOUTH0 + 30 * i,
100: MOUTH_WIDTH - 20, MOUTH_WIDTH - 20);
101: //Add text in Times New Roman, 12 point:
102: gc.setFont(Font.font("Times New Roman", 12));
103: gc.setFill(Color.BLACK);
104: gc.fillText("Kiss, Kiss.",
105: X_FACE0 + 50 * i + FACE_DIAMETER, Y_FACE0 + 30 * i);
107: //Draw blushing face:
108: i++;
109: //Draw face circle:
110: gc.setFill(Color.PINK);
111: gc.fillOval(X_FACE0 + 50*i, Y_FACE0 + 30*i,
112: FACE_DIAMETER, FACE_DIAMETER);
113: drawFaceSansMouth(gc, i);
114: gc.setFill(Color.RED);
115: //Draw mouth:
116: gc.setFill(Color.BLACK);
117: gc.strokeArc(X_MOUTH0 + 50*i, Y_MOUTH0 + 30*i, MOUTH_WIDTH,
118: MOUTH_HEIGHT0 + 3 * (i - 2),
119: MOUTH_START_ANGLE, MOUTH_EXTENT_ANGLE, ArcType.OPEN);
120: //Add text in Courier New Font, 16 point:
121: gc.setFont(Font.font("Courier New ", 16));
122: gc.fillText("Tee Hee.",
123: X_FACE0 + 50*i + FACE_DIAMETER, Y_FACE0 + 30*i);
125: root.getChildren().add(canvas);
126: primaryStage.setTitle("MultipleFaces in JavaFX");
127: primaryStage.setScene(scene);
128: primaryStage.show();
129: }
130: }