next up previous contents
Next: NumberLabelGroup Class Up: MyAwt Package Previous: InsetPanel Class

NumberLabel Class

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;
   }

}



Kelly Waters
Mon Oct 27 18:18:15 EST 1997