package vehicleMap;import java.awt.AlphaComposite;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.Point2D;
import java.awt.Color;
import java.util.Timer;
import java.util.TimerTask;import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;/** 
 * 当需要更新坐标的时候可以利用setPoint(Point point) 方法
 * 因为经类继承了JLabel 并覆盖了paint(Graphics g)方法
 * 利用 Timer 的 TimerTask 类利用线程的知识 使paint(Graphics g)不停的更新
 * 
 * 另外还有一个问题 就是主JPanel 中添加此实例的问题.. 因为JPanel的布局原因 我每次只能添加一个实例
 * 每次我们所看见的都是最先或最好添加的实例 必需考虑两个或多个实例能同时显示的技术.
 *//** 故障显示类 */
public class ShowFailure extends JLabel implements Runnable { /* 故障显示区域 周期 */
protected static final int CYCLE = 3; private static final int delay = 300; /* 此Label的 alpha 值 */
protected static final float alpha = 0.5f; /* 具体坐标点 */
private Point point = new Point(0, 0); /* 所要显示的信息 */
private String message; /* 重绘次数 */
private int count; /* 故障显示区域的大小 */
private int width = 40, height = 40; /* 预留图像处理类 */
private ImageProcess imageControl; /* 重绘开关 */
private boolean opaque; /* 前景颜色 */
private Color color = Color.red; /* 构造子 */
public ShowFailure(Color color) {
this.color = color;
} public ShowFailure() {
super.setSize(width, height);
} public void setPoint(Point nextPoint) {
this.point = nextPoint;
repaint();
} public void setPoint(int x, int y) {
this.point.setLocation(x, y);
} public Point getPoint() {
if (point != null) {
System.out.println("oK");
return point;
} else {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return point;
}
} /** Override of paintChildren - draw Ranctangle */
public void paint(Graphics g) {
((Graphics2D) g).setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, alpha));
this.setForeground(Color.red);
count++; int xVal = (int) getPoint().getX() ;
int yVal = (int) getPoint().getY() ;
System.out.println("xVal is:"+xVal+"yVal is:"+yVal);
if (count % this.CYCLE == 0) {
g.setColor(color);
g.fillRect(xVal, yVal, width, height);
}
} public void run() {
while (true) {
repaint();
try {
Thread.sleep(this.delay);
} catch (InterruptedException ite) {
ite.printStackTrace();
}
}
} /*
 * public void start() { runUpdates(delay); }
 */ public void Stop() {
System.out.println("故障处理结束..");
this.setVisible(false);
} public int getCount() {
return this.count;
} public static void main(String[] args) {
JFrame jf = new JFrame("测试代码!");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(800, 600);
jf.setLayout(null);
JPanel jj = (JPanel)jf.getContentPane();

JPanel jp = new JPanel();
jp.setLayout(null);
jp.setOpaque(true);
jp.setSize(800,600);
jj.add(jp);

jf.setVisible(true);
ShowFailure show1 = new ShowFailure(); ShowFailure show = new ShowFailure();
show1.setPoint(new Point(110, 110));
show .setPoint(111,111); //这里的两个值改成10或更小则可以显示但为什么改成111就不行了呢.. 在线等
new Thread(show).start();
new Thread(show1).start();
jp.add(show1);
jp.add(show); }}

解决方案 »

  1.   

    package vehicleMap;import java.awt.AlphaComposite;
    import java.awt.Component;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.geom.Point2D;
    import java.awt.image.ImageProducer;
    import java.awt.Color;
    import java.util.Timer;
    import java.util.TimerTask;import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;/** 
     * 当需要更新坐标的时候可以利用setPoint(Point point) 方法
     * 因为经类继承了JLabel 并覆盖了paint(Graphics g)方法
     * 利用 Timer 的 TimerTask 类利用线程的知识 使paint(Graphics g)不停的更新
     * 
     * 另外还有一个问题 就是主JPanel 中添加此实例的问题.. 因为JPanel的布局原因 我每次只能添加一个实例
     * 每次我们所看见的都是最先或最好添加的实例 必需考虑两个或多个实例能同时显示的技术.
     *//** 故障显示类 */
    public class ShowFailure extends JLabel implements Runnable {/* 故障显示区域 周期 */
    protected static final int CYCLE = 3;private static final int delay = 300;/* 此Label的 alpha 值 */
    protected static final float alpha = 0.5f;/* 具体坐标点 */
    private Point point = new Point(0, 0);/* 所要显示的信息 */
    private String message;/* 重绘次数 */
    private int count;/* 故障显示区域的大小 */
    private int width = 340, height = 340;/* 预留图像处理类 */
    private ImageProducer imageControl;/* 重绘开关 */
    private boolean opaque;/* 前景颜色 */
    private Color color = Color.red;/* 构造子 */
    public ShowFailure(Color color) {
    this.color = color;
    }public ShowFailure() {
    super.setSize(width, height);
    }public void setPoint(Point nextPoint) {
    this.point = nextPoint;
    repaint();
    }public void setPoint(int x, int y) {
    this.point.setLocation(x, y);
    }public Point getPoint() {
    if (point != null) {
    System.out.println("oK");
    return point;
    } else {
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    return point;
    }
    }/** Override of paintChildren - draw Ranctangle */
    public void paint(Graphics g) {
    ((Graphics2D) g).setComposite(AlphaComposite.getInstance(
    AlphaComposite.SRC_OVER, alpha));
    this.setForeground(Color.red);
    count++;int xVal = (int) getPoint().getX() ;
    int yVal = (int) getPoint().getY() ;
    System.out.println("xVal is:"+xVal+"yVal is:"+yVal);
    if (count % this.CYCLE == 0) {
    g.setColor(color);
    g.fillRect(xVal, yVal, width, height);
    }
    }public void run() {
    while (true) {
    repaint();
    try {
    Thread.sleep(this.delay);
    } catch (InterruptedException ite) {
    ite.printStackTrace();
    }
    }
    }/*
     * public void start() { runUpdates(delay); }
     */public void Stop() {
    System.out.println("故障处理结束..");
    this.setVisible(false);
    }public int getCount() {
    return this.count;
    }public static void main(String[] args) {
    JFrame jf = new JFrame("测试代码!");
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setSize(800, 600);
    jf.setLayout(null);
    JPanel jj = (JPanel)jf.getContentPane();JPanel jp = new JPanel();
    jp.setLayout(null);
    jp.setOpaque(true);
    jp.setSize(800,600);
    jj.add(jp);jf.setVisible(true);
    ShowFailure show1 = new ShowFailure();ShowFailure show = new ShowFailure();
    show1.setPoint(new Point(110, 110));
    show .setPoint(111,111);
    new Thread(show).start();
    new Thread(show1).start();
    jp.add(show1);
    jp.add(show);}}