public class Switch extends JComponent implements Serializable{
ServerThread sth;
BytesPaser bytePs=null;    //这两个是关联类的对象

/**
         *LED颜色
 */
public static Color LED_UP_COLOR=Color.green;
  public static Color LED_DOWN_COLOR=Color.red;
protected Color m_color;
  
   /**
    * LED闪烁间隔
 *
 */
private int m_blinkInterval;
public int getBlinkInterval(){
return m_blinkInterval;
}
        public void setBlinkInterval(int blinkInterval){
     m_blinkInterval=blinkInterval;
        }
    
    /**
     * LED位置
     *
     */
    public final static int UP=0;
    public final static int DOWN=1;
    private int m_position;
    public int getPosition(){
     return m_position;
    }
    public void setPosition(int newPosition){
     synchronized(this){
     m_position=newPosition;
     switch(newPosition){
     case UP:
     m_color=LED_UP_COLOR;
     break;
     case DOWN:
     m_color=LED_DOWN_COLOR;
     break;
        }
     }
     repaintLED();
     processEvent(new TextEvent(getLabel2(),TextEvent.TEXT_VALUE_CHANGED));//??ishangOn作为事件源
    }
    /**
     * 标签文本,杆号
     *
     */   
    private String label1;                  
    public String getLabel1(){
    
     return label1;
    }
   public void setLabel1(String newLabel){
     label1=newLabel;
     newLabel=String.valueOf(sth.LineNO);
   }
    
    /**
     * ishangOn标签文本
     *
     */
   private int label2;
   public int getLabel2(){
      return label2;
   }
   public void setLabel2(int newLabel){
    label2=newLabel;
    newLabel=sth.ishangOn;
    }  
  /** 
   * 随ishangOn标签的值改变
   * 可以循环改变LED的位置
   */
    public void textValueChanged(TextEvent e){
    
     if(bytePs.stateChanged){
     int newPos=getLabel2();
     switch(newPos){
     case UP:
     newPos=DOWN;
     break;
     case DOWN:
     newPos=UP;
     break;
           setPosition(newPos);   //这里一直报错,提示不可达代码
     }
     }
    
    }
    
   /**
    * 添加属性,以便使用者调用监听器
    */
   private transient TextListener t_Listener;
    public void addTextListener(TextListener l){
     t_Listener=AWTEventMulticaster.add(t_Listener,l);//不是数字1,是L
    
    }
    public synchronized void removeTextListener(TextListener l){
     t_Listener=AWTEventMulticaster.remove(t_Listener, l);
    
    }
   /*protected void processEvent(TextEvent le){
     if(t_Listener!=null){
     processTextEvent((TextEvent)t_Listener);
     return;
     }
     super.processEvent(e);
    }*/
   protected void processTextEvent(TextEvent e){
   if(t_Listener!=null){
   t_Listener.textValueChanged(e);
   }
   }
    
   /* 
    * 得到最佳尺寸
    */
    protected final static int SHIM=10;
    private static final int BLINK_INTERVAL = 1000;
    private static final String LABEL1 = null;
    private static final int LABEL2 = 0;
    public Dimension getPreferredSize(){
Dimension prefSize=new Dimension();
prefSize.width=getLEDDiameter()+(3*SHIM);
prefSize.height=getLEDDiameter();
prefSize.height+=(2*SHIM);
if(getLabel1()!=null){
FontMetrics fm1=getFontMetrics(getFont());
prefSize.width+=fm1.stringWidth(getLabel1())+SHIM;
prefSize.height=Math.max(prefSize.height,(2*SHIM)+fm1.getHeight());
}
if(String.valueOf(getLabel2())!=null){//强制成String,真的很勉强
FontMetrics fm2=getFontMetrics(getFont());
prefSize.width+=fm2.charWidth(getLabel2())+SHIM;
prefSize.height=Math.max(prefSize.height,(2*SHIM)+fm2.getHeight());
}
return prefSize;

}

    public static int LED_DIAMETER=20;
    protected int m_ledDiam;
    public int getLEDDiameter(){
return m_ledDiam;
    }
    public void setLEDDiameter(int ledDiam){
m_ledDiam=ledDiam;
invalidate();//当修改属性时,强迫父容器重新布局
    }
    public void setLabel(String newLabel){
label1=newLabel;
invalidate();
    }    /**
     * 构造函数
     * @param label1
     * @param label2
     * @param ledDiam
     * @param blinkInterval
     */
    public Switch(String label1,int label2,int ledDiam, int blinkInterval){
setLabel1(label1);
setLabel2(label2);
setLEDDiameter(ledDiam);
setBlinkInterval(blinkInterval);
setPosition(UP);
addTextListener(t_Listener);   //这是个核心问题
      }
     public Switch(String label1,int label2){
this(label1,label2,LED_DIAMETER,BLINK_INTERVAL);
setLabel1(label1);
setLabel2(label2);
setLEDDiameter(LED_DIAMETER);
setBlinkInterval(BLINK_INTERVAL);
setPosition(UP);
//addTextListener(t_Listener);
        }
       public Switch(){
      this(LABEL1, LABEL2,LED_DIAMETER,BLINK_INTERVAL);
}      /**
       * @绘图属性
       */
      protected int getLEDX(){
           return SHIM;
      }
      protected int getLEDY(){
   return (((getSize()).height-getLEDDiameter())/2);
      }     /* 
      * 
      * 绘图以及更新
      */
      public void paint(Graphics g){
     super.paint(g);
     drawLED(getLEDX(),getLEDY(),getLEDDiameter(),g,m_color);
     if(getLabel1()!=null){
                  if(bytePs.stateChanged){
g.setColor(getForeground());
  }else{
g.setColor(SystemColor.textInactiveText);
}
FontMetrics fm=g.getFontMetrics();
g.drawString(getLabel1(), getLabel2(), (getSize().height-fm.getHeight())/2+fm.getAscent());
    }
         }
        public void update(Graphics g){
        paint(g);
         }        protected void drawLED(int x,int y,int diam, Graphics g, Color c){
      int diameter=diam;
      int LEDx=x;
      int LEDy=y;

g.setColor(Color.BLUE);
g.drawArc(LEDx, LEDy, diameter, diameter, 45, 180);
// g.setColor(Color.);
g.drawArc(LEDx, LEDy, diameter, diameter, 225, 180);

g.setColor(c);
g.fillOval(LEDx+1, LEDy+1, diameter-2, diameter-2);

// g.setColor(Colors.brighter(c));
g.drawArc(LEDx+(diameter/10), LEDy+(diameter/10), (4*diameter)/5, (4*diameter)/5, 80,110);

g.setColor(Color.white);
g.drawArc(LEDx+(diameter/4)+1, LEDy+(diameter/4)+1, diameter/4, diameter/4, 80, 110);

g.drawArc(LEDx+(diameter/4)+2, LEDy+(diameter/4)+2, (diameter)/5,(diameter)/5 , 80, 110);

g.setColor(Color.BLUE);
g.drawArc(LEDx+(diameter/10), LEDy+(diameter/10), (4*diameter)/5, (4*diameter)/5, 260, 110);
       }       protected void repaintLED(){
     repaint(getLEDX(),getLEDY(),getLEDDiameter()+SHIM,getLEDDiameter());
       }
   }
这段代码的目的就是显示Label1,Label2,LED灯,其中LED灯的颜色随着Label2里输入的值0/1变化,Label2里的0/1是由通信传入的状态值。
我怎么弄 setPosition(newPos)都报错。
注释掉它测试,Applet里什么也不显示。