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里什么也不显示。
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里什么也不显示。
绘图属性、更新等都跟例子一样,应该没有问题的。
主要帮我改改setPosition()啊,构造函数什么的吧,谢谢!
至于
setPosition(newPos); //这里一直报错,提示不可达代码
你都break;了,自然不能运行到...