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;
10:
11: public class MultipleFaces extends Application
12: {
13: public static final int WINDOW_WIDTH = 450;
14: public static final int WINDOW_HEIGHT = 300;
15:
16: public static final int FACE_DIAMETER = 50;
17: public static final int X_FACE0 = 10;
18: public static final int Y_FACE0 = 5;
19:
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;
26:
27: public static final int NOSE_DIAMETER = 5;
28: public static final int X_NOSE0 = 32;
29: public static final int Y_NOSE0 = 25;
30:
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;
37:
38: public static void main(String[] args)
39: {
40: launch(args);
41: }
42:
43: @Override
44: public void start(Stage primaryStage) throws Exception
45: {
46: Group root = new Group();
47: Scene scene = new Scene(root);
48:
49: Canvas canvas = new Canvas(WINDOW_WIDTH, WINDOW_HEIGHT);
50: GraphicsContext gc = canvas.getGraphicsContext2D();
51:
52: int i, xOffset, yOffset; //Want i to exist after the loop ends
53:
54: for (i = 0; i <= 4; i++)
55: {//Draw one face:
56: xOffset = 50 * i;
57: yOffset = 30 * i;
58:
59: //Draw face circle:
60: if (i % 2 == 0)//if i is even
61: {//Make face light gray
62: gc.setFill(Color.LIGHTGRAY);
63: gc.fillOval(X_FACE0 + xOffset, Y_FACE0 + 30 * i,
64: FACE_DIAMETER, FACE_DIAMETER);
65: }
66: gc.setFill(Color.BLACK);
67: gc.strokeOval(X_FACE0 + xOffset, Y_FACE0 + yOffset,
68: FACE_DIAMETER, FACE_DIAMETER);
69: //Draw eyes:
70: gc.setFill(Color.BLACK);
71: gc.fillOval(X_RIGHT_EYE0 + xOffset, Y_RIGHT_EYE0 + yOffset,
72: EYE_WIDTH, EYE_HEIGHT);
73: gc.fillOval(X_LEFT_EYE0 + xOffset, Y_LEFT_EYE0 + yOffset,
74: EYE_WIDTH, EYE_HEIGHT);
75: //Draw nose:
76: gc.setFill(Color.BLACK);
77: gc.fillOval(X_NOSE0 + xOffset, Y_NOSE0 + yOffset,
78: NOSE_DIAMETER, NOSE_DIAMETER);
79: //Draw mouth:
80: gc.setFill(Color.BLACK);
81: gc.strokeArc(X_MOUTH0 + xOffset, Y_MOUTH0 + yOffset,
82: MOUTH_WIDTH, MOUTH_HEIGHT0 + 3 * i + 1,
83: MOUTH_START_ANGLE, MOUTH_EXTENT_ANGLE,
84: ArcType.OPEN);
85: }
86: //i is 5 when the previous loop ends
87: xOffset = 50 * i;
88: yOffset = 30 * i;
89:
90: //Draw kissing face:
91: //Draw face circle:
92: gc.setFill(Color.BLACK);
93: gc.strokeOval(X_FACE0 + xOffset, Y_FACE0 + yOffset,
94: FACE_DIAMETER, FACE_DIAMETER);
95: //Draw eyes:
96: gc.setFill(Color.BLACK);
97: gc.fillOval(X_RIGHT_EYE0 + xOffset, Y_RIGHT_EYE0 + yOffset,
98: EYE_WIDTH, EYE_HEIGHT);
99: gc.fillOval(X_LEFT_EYE0 + xOffset, Y_LEFT_EYE0 + yOffset,
100: EYE_WIDTH, EYE_HEIGHT);
101: //Draw nose:
102: gc.setFill(Color.BLACK);
103: gc.fillOval(X_NOSE0 + xOffset, Y_NOSE0 + yOffset,
104: NOSE_DIAMETER, NOSE_DIAMETER);
105: //Draw mouth in shape of a kiss:
106: gc.setFill(Color.BLACK);
107: gc.fillOval(X_MOUTH0 + xOffset + 10, Y_MOUTH0 + yOffset,
108: MOUTH_WIDTH - 20, MOUTH_WIDTH - 20);
109: //Add text in Times New Roman, 12 point:
110: gc.setFont(Font.font("Times New Roman", 12));
111: gc.fillText("Kiss, Kiss.",
112: X_FACE0 + xOffset + FACE_DIAMETER, Y_FACE0 + yOffset);
113:
114:
115: //Draw blushing face:
116: i++;
117: xOffset = 50 * i;
118: yOffset = 30 * i;
119:
120: //Draw face circle:
121: gc.setFill(Color.GRAY);
122: gc.fillOval(X_FACE0 + xOffset, Y_FACE0 + yOffset,
123: FACE_DIAMETER, FACE_DIAMETER);
124: gc.setFill(Color.BLACK);
125: gc.strokeOval(X_FACE0 + xOffset, Y_FACE0 + yOffset,
126: FACE_DIAMETER, FACE_DIAMETER);
127: //Draw eyes:
128: gc.setFill(Color.BLACK);
129: gc.fillOval(X_RIGHT_EYE0 + xOffset, Y_RIGHT_EYE0 + yOffset,
130: EYE_WIDTH, EYE_HEIGHT);
131: gc.fillOval(X_LEFT_EYE0 + xOffset, Y_LEFT_EYE0 + yOffset,
132: EYE_WIDTH, EYE_HEIGHT);
133: //Draw nose:
134: gc.setFill(Color.BLACK);
135: gc.fillOval(X_NOSE0 + xOffset, Y_NOSE0 + yOffset,
136: NOSE_DIAMETER, NOSE_DIAMETER);
137: //Draw mouth:
138: gc.setFill(Color.BLACK);
139: gc.strokeArc(X_MOUTH0 + xOffset, Y_MOUTH0 + yOffset, MOUTH_WIDTH,
140: MOUTH_HEIGHT0 + 3 * (i - 2),
141: MOUTH_START_ANGLE, MOUTH_EXTENT_ANGLE, ArcType.OPEN);
142: //Add text in Courier New Font, 16 point:
143: gc.setFont(Font.font("Courier New ", 16));
144: gc.fillText("Tee Hee.",
145: X_FACE0 + xOffset + FACE_DIAMETER, Y_FACE0 + yOffset);
146:
147: root.getChildren().add(canvas);
148: primaryStage.setTitle("MultipleFaces in JavaFX");
149: primaryStage.setScene(scene);
150: primaryStage.show();
151: }
152: }
153:
154: