# Java: Example - Sleepy Source

| This program combines components (eg, buttons) and drawing. The `Sleeper` panel is used for graphics. In addition to its public constructor, it also has a public method, `setAwake(...)`, that sets the state of the face to either asleep or awake. This method is called to cause the face to change.

    // Sleepy.java - Face with buttons -- Fred Swartz 2002-11-15
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;

    /////////////////////////////////////////////////////////// class Sleepy
    class Sleepy {

        //================================================== method main
        public static void main(String[] args) {
            JFrame windo = new JFrame("Sleepy");
            windo.getContentPane().add(new SleepyPanel());
            windo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            windo.pack();
            windo.show();
        }//end main

    }//end class Sleepy

    ////////////////////////////////////////////////////// class SleepyPanel
    class SleepyPanel extends JPanel {
        private Sleeper face = new Sleeper();

        //================================================== constructor
        SleepyPanel() {
            //--- Create some buttons
            JButton awakeButton = new JButton("Awake");
            awakeButton.addActionListener(
                new ActionListener() {

                    //========================================= listener
                    public void actionPerformed(ActionEvent e) {
                        face.setAwake(true);
                    }//end listener

                }
            );
            JButton asleepButton = new JButton("Asleep");
            asleepButton.addActionListener(
                new ActionListener() {

                    //========================================= listener
                    public void actionPerformed(ActionEvent e) {
                        face.setAwake(false);
                    }//end listener

                }
            );

            //--- Put the buttons in a flowlayout panel
            JPanel buttonPanel = new JPanel();
            buttonPanel.setLayout(new FlowLayout());
            buttonPanel.add(awakeButton);
            buttonPanel.add(asleepButton);

            //--- Set layout and add buttons and face
            this.setLayout(new BorderLayout());
            this.add(buttonPanel, BorderLayout.NORTH);
            this.add(face, BorderLayout.CENTER);
        }//end constructor

    }//endclass SleepyPanel

    ////////////////////////////////////////////////////////// class Sleeper
    class Sleeper extends JPanel {

        //------------------------------------------- instance variables
        private boolean awake = false;  // show face awake or asleep
        //end instance variables

        //================================================== constructor
        Sleeper() {
            this.setBackground(Color.lightGray);
            this.setPreferredSize(new Dimension(400, 400));  // size
        }//end constructor

        //======================================== logic method setAwake

        public void setAwake(boolean awakeAsleep) {
            awake = awakeAsleep; // remember expression on face
            repaint();           // redraw it with new value
        }//end setAwake

        //================================== logic method paintComponent
        public void paintComponent(Graphics g) {
            super.paintComponent(g);  // MUST be first line

            //--- draw head
            g.setColor(Color.yellow);
            g.fillOval(8, 8, 384, 384);

            //--- draw eyes
            g.setColor(Color.black);
            if (awake) {
                g.fillOval(100, 150, 50, 100);  // left eye
                g.fillOval(250, 150, 50, 100);  // right eye
            }
            else {
                g.fillRect(50 , 200, 100, 4); // left eye
                g.fillRect(250, 200, 100, 4); // left eye
            }
        }//end paintComponent

    }//endclass Sleeper

The text from the above example can be selected, copied, and pasted into an editor. The boxes will be ignored.
Sections that are colored orange are executed at run time.