The NumberLabel class defines a selectable label which can display numbers within a given range. The class was designed to be used in conjunction with the Java awt Scrollbar class. It was devised in part from a LabelCanvas class listed in graphic Java [4]. A NumberLabelGroup allows a set of NumberLabel objects to offer exclusive selection like radio buttons. The NumberLabel group() method provides a means to add NumberLabel objects to a NumberLabelGroup. The GraphControlPanel class uses a set of NumberLabel objects and a NumberLabelGroup to associate the NumberLabel objects with a single Scrollbar object.
package MyAwt;
import java.awt.*;
public class NumberLabel extends Canvas {
private int p_value, p_min, p_max;
private String p_label;
private boolean p_selected = false;
private Point p_loc = new Point(0,0);
private Insets p_insets = new Insets(0,2,0,2);
private NumberLabelGroup p_group;
public NumberLabel(int value, int min, int max) {
min(min);
max(max);
value(value);
}
public NumberLabel(int value, int min, int max, Insets insets) {
this(value,min,max);
insets(insets);
}
public NumberLabel(int value, int min, int max, NumberLabelGroup group) {
this(value,min,max);
group(group);
}
public NumberLabel(int value, int min, int max,
Insets insets, NumberLabelGroup group) {
this(value,min,max);
insets(insets);
group(group);
}
public NumberLabelGroup group() { return p_group; }
public void group(NumberLabelGroup group) {
selected(false);
p_group=group;
}
public int min() {return p_min; }
public void min(int min) {
if (p_min==min)
return;
p_min=min;
if (p_max<p_min)
p_max = p_min;
if (p_value<p_min)
p_value=p_min;
modified();
}
public int max() {return p_max; }
public void max(int max) {
if (p_max==max)
return;
p_max=max;
if (p_min>p_max)
p_min = p_max;
if (p_value>p_max)
p_value=p_max;
modified();
}
public int value() { return p_value; }
public void value(int value) {
int oldValue = p_value;
if (value<p_min)
p_value = p_min;
else if(value>p_max)
p_value = p_max;
else p_value = value;
if (oldValue!=p_value)
modified();
}
private void modified() {
int i,j=9;
if (p_min>=0)
i = p_max;
else if (p_max<=0)
i = -p_min;
else
i = -p_min>p_max?-p_min:p_max;
while(j<i)
j=j*10+9;
p_label = new String((p_min<0?-j:j)+"");
if (isVisible())
repaint();
}
public void insets(int top, int left, int bottom, int right) {
p_insets.top = top>1?top:2;
p_insets.bottom = bottom>1?bottom:2;
p_insets.left = left>1?left:2;
p_insets.right = right>1?right:2;
if (isVisible())
repaint();
}
public void insets(Insets insets) {
if (insets!=null)
insets(p_insets.top, p_insets.left, p_insets.bottom, p_insets.right);
}
public boolean selected() { return p_selected; }
public void selected(boolean tf) {
if (tf!=p_selected) {
p_selected = tf;
if (p_group!=null)
if (p_selected)
p_group.select(this);
else
p_group.unselect(this);
if (isVisible())
repaint();
}
}
public void resize(int w, int h) {
Point loc = location();
reshape(loc.x, loc.y, w, h);
}
public void reshape(int x, int y, int w, int h) {
super.reshape(x,y,w,h);
Dimension size = size();
FontMetrics fm = getFontMetrics(getFont());
if (fm!=null) {
p_loc.x = (size.width - p_insets.right - p_insets.left)/2
- fm.stringWidth(p_label)/2
+ p_insets.right;
p_loc.y = (size.height - p_insets.top - p_insets.bottom)/2
+ fm.getAscent()/2
+ p_insets.top;
}
}
public void paint(Graphics g) {
Color original = g.getColor(),
back = getBackground(),
fore = getForeground();
Dimension dim = preferredSize();
if (p_selected)
if (back!=Color.white) g.setColor(Color.white);
else g.setColor(fore);
else g.setColor(back);
g.fillRect((size().width-dim.width)/2,
(size().height-dim.height)/2,
dim.width, dim.height );
if (p_selected)
if (back!=Color.white) g.setColor(Color.black);
else g.setColor(back);
else g.setColor(fore);
g.drawString(p_value+"", p_loc.x, p_loc.y);
g.setColor(original);
}
public Dimension minimumSize() { return preferredSize(); }
public Dimension preferredSize() {
FontMetrics fm = getFontMetrics(getFont());
return new Dimension(fm.stringWidth(p_label)
+ p_insets.right + p_insets.left,
fm.getHeight() + p_insets.top + p_insets.bottom);
}
public String toString() { return super.toString() + p_value; }
public boolean mouseDown(Event e, int x, int y) {
selected(!p_selected);
int et = selected()?SEvent.SELECT:SEvent.DESELECT;
deliverEvent(new SEvent(this,e,et));
return true;
}
}