import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
/**
* Abstract base class for all IncDec's
* with specialized stuff factored into separate overridable methods
*/
abstract public class Incdec extends JPanel implements ActionListener {
/**
* Our internal components that we need to remember
*/
protected JButton upButton, downButton;
protected JLabel label;
/**
* Our data, initialized inline here
*/
protected int value = 0;
protected int min = 0;
protected int max = 100;
protected int incr = 1;
/**
* Only those aspects of initialization that everbody will want
*/
protected Incdec () {
// Put a border on our JPanel
setBorder (new LineBorder(Color.RED, 1));
}
/**
* Pieces of old constructor, factored out here for subclasses to use
*/
protected void makeUp () { //*1 Chop up old constructor for use by subclasses
upButton = new JButton ("+"); //*1
upButton.addActionListener (this); //*1
add (upButton); //*1
}
protected void makeDown () { //*2 makeDown, similarly
downButton = new JButton ("-"); //*2
downButton.addActionListener (this); //*2
add (downButton); //*2
}
protected void makeLabel () { //*3 makeLabel, similarly
label = new JLabel (); //*3
label.setHorizontalAlignment (JLabel.CENTER); //*3
refreshLabel (); //*3
add (label); //*3
}
/**
* Common callback for both buttons,
* we use ivar to disambiguate.
*/
public void actionPerformed (ActionEvent e) {
if (e.getSource()==upButton) value += incr;
else if (e.getSource()==downButton) value -= incr;
// Clamp at bounds
if (value > max) value = max;
if (value < min) value = min;
// Update our widget to match
refreshLabel ();
}
/**
* Common code fragment, extracted to here
*/
protected void refreshLabel() {
label.setText (String.valueOf (value));
}
public int getValue() { return value; }
}