Java tutorial
/* 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"; }