Source of MultipleFaces.java


  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: }