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.