Sketch.java Source code

Java tutorial

Introduction

Here is the source code for Sketch.java

Source

/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O'Reilly 
*/
// Sketch.java
//A sketching application with two dials: one for horizontal movement, one
//for vertical movement. The dials are instances of the JogShuttle class.
//

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.BoundedRangeModel;
import javax.swing.DefaultBoundedRangeModel;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.ComponentUI;

public class Sketch extends JPanel implements PropertyChangeListener, ActionListener {
    JogShuttle shuttle1;

    JogShuttle shuttle2;

    JPanel board;

    JButton clear;

    int lastX, lastY; // Keep track of the last point we drew.

    public Sketch() {
        super(true);

        setLayout(new BorderLayout());
        board = new JPanel(true);
        board.setPreferredSize(new Dimension(300, 300));
        board.setBorder(new LineBorder(Color.black, 5));

        clear = new JButton("Clear Drawing Area");
        clear.addActionListener(this);

        shuttle1 = new JogShuttle(0, 300, 150);
        lastX = shuttle1.getValue();
        shuttle2 = new JogShuttle(0, 300, 150);
        lastY = shuttle2.getValue();

        shuttle1.setValuePerRevolution(100);
        shuttle2.setValuePerRevolution(100);

        shuttle1.addPropertyChangeListener(this);
        shuttle2.addPropertyChangeListener(this);

        shuttle1.setBorder(new BevelBorder(BevelBorder.RAISED));
        shuttle2.setBorder(new BevelBorder(BevelBorder.RAISED));

        add(board, BorderLayout.NORTH);
        add(shuttle1, BorderLayout.WEST);
        add(clear, BorderLayout.CENTER);
        add(shuttle2, BorderLayout.EAST);
    }

    public void propertyChange(PropertyChangeEvent e) {
        if (e.getPropertyName() == "value") {
            Graphics g = board.getGraphics();
            g.setColor(getForeground());
            g.drawLine(lastX, lastY, shuttle1.getValue(), shuttle2.getValue());
            lastX = shuttle1.getValue();
            lastY = shuttle2.getValue();
        }
    }

    public void actionPerformed(ActionEvent e) {
        //  The button must have been pressed.
        Insets insets = board.getInsets();
        Graphics g = board.getGraphics();
        g.setColor(board.getBackground());
        g.fillRect(insets.left, insets.top, board.getWidth() - insets.left - insets.right,
                board.getHeight() - insets.top - insets.bottom);
    }

    public static void main(String[] args) {
        UIManager.put(JogShuttleUI.UI_CLASS_ID, "BasicJogShuttleUI");
        Sketch s = new Sketch();
        JFrame frame = new JFrame("Sample Sketch Application");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(s);
        frame.pack();
        frame.setVisible(true);
    }
}

//JogShuttle.java
//A custom jog shuttle component. (Some VCRs have such a thing for doing
//variable speed fast-forward and fast-reverse.) An example of using the
//JogShuttle can be found in Sketch.java.
//

class JogShuttle extends JComponent implements ChangeListener {

    private BoundedRangeModel model;

    //  The dialInsets property tells how far the dial is inset
    //  from the sunken border.
    private Insets dialInsets = new Insets(3, 3, 3, 3);

    //  The valuePerRevolution property tells how many units the dial
    //  takes to make a complete revolution.
    private int valuePerRevolution;

    //  Constructors
    public JogShuttle() {
        init(new DefaultBoundedRangeModel());
    }

    public JogShuttle(BoundedRangeModel m) {
        init(m);
    }

    public JogShuttle(int min, int max, int value) {
        init(new DefaultBoundedRangeModel(value, 1, min, max));
    }

    protected void init(BoundedRangeModel m) {
        setModel(m);
        valuePerRevolution = m.getMaximum() - m.getMinimum();
        setMinimumSize(new Dimension(80, 80));
        setPreferredSize(new Dimension(80, 80));
        updateUI();
    }

    public void setUI(JogShuttleUI ui) {
        super.setUI(ui);
    }

    public void updateUI() {
        setUI((JogShuttleUI) UIManager.getUI(this));
        invalidate();
    }

    public String getUIClassID() {
        return JogShuttleUI.UI_CLASS_ID;
    }

    public void setModel(BoundedRangeModel m) {
        BoundedRangeModel old = model;
        if (old != null)
            old.removeChangeListener(this);

        if (m == null)
            model = new DefaultBoundedRangeModel();
        else
            model = m;
        model.addChangeListener(this);

        firePropertyChange("model", old, model);
    }

    public BoundedRangeModel getModel() {
        return model;
    }

    //  Methods
    public void resetToMinimum() {
        model.setValue(model.getMinimum());
    }

    public void resetToMaximum() {
        model.setValue(model.getMaximum());
    }

    public void stateChanged(ChangeEvent e) {
        repaint();
    }

    //  Accessors and mutators
    public int getMinimum() {
        return model.getMinimum();
    }

    public void setMinimum(int m) {
        int old = getMinimum();
        if (m != old) {
            model.setMinimum(m);
            firePropertyChange("minimum", old, m);
        }
    }

    public int getMaximum() {
        return model.getMaximum();
    }

    public void setMaximum(int m) {
        int old = getMaximum();
        if (m != old) {
            model.setMaximum(m);
            firePropertyChange("maximum", old, m);
        }
    }

    public int getValue() {
        return model.getValue();
    }

    public void setValue(int v) {
        int old = getValue();
        if (v != old) {
            model.setValue(v);
            firePropertyChange("value", old, v);
        }
    }

    //  Display-specific properties
    public int getValuePerRevolution() {
        return valuePerRevolution;
    }

    public void setValuePerRevolution(int v) {
        int old = getValuePerRevolution();
        if (v != old) {
            valuePerRevolution = v;
            firePropertyChange("valuePerRevolution", old, v);
        }
        repaint();
    }

    public void setDialInsets(Insets i) {
        dialInsets = i;
    }

    public void setDialInsets(int top, int left, int bottom, int right) {
        dialInsets = new Insets(top, left, bottom, right);
    }

    public Insets getDialInsets() {
        return dialInsets;
    }
}

//JogShuttleUI.java
//Fill out the proper UIClassID information for our JogShuttle.
//

abstract class JogShuttleUI extends ComponentUI {
    public static final String UI_CLASS_ID = "JogShuttleUI";
}