import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TimerLine extends JPanel{ /**
 * 
 */
private static final long serialVersionUID = 1L;
public TimerLine(){
this.setSize(300,300);
}
@Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
for(int i=0;i<10;i++)
g.drawLine(10, 10*(i+1), 100, 10*(i+1));
}
public static void main(String[] args) {
// TODO Auto-generated method stub JFrame f=new JFrame();
TimerLine tl=new TimerLine();
f.add(tl);
f.setSize(400,400);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}}
上面的代码是画10条直线。我想加入一个线程或者是Timer类。控制这个程序在画了一条线以后间隔几秒再画下一条。可是画线的话需要一个参数g,run方法里不能传入参数,该如何解决呢?求解!!

解决方案 »

  1.   


    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;import javax.swing.JFrame;
    import javax.swing.JPanel;public class TimerLine extends JPanel implements Runnable {
    static Canvas canvas;
    private int X;
    private int Y;
    private int Width;
    private int Height; /**
    *  
    */
    // private static final long serialVersionUID = 1L; public TimerLine() { this.setSize(300, 300); } @Override
    protected void paintComponent(Graphics g) { // TODO Auto-generated method stub
    // for (int i = 0; i < 10; i++) {
    // g.drawLine(10, 10 * (i + 1), 100, 10 * (i + 1));
    // }
    g.drawLine(X, Y, Width, Height);
    } public static void main(String[] args) {
    // TODO Auto-generated method stub JFrame f = new JFrame();
    TimerLine tl = new TimerLine();
    canvas = new Canvas();
    canvas.setSize(300, 300);
    f.add(canvas);
    f.add(tl);
    f.setSize(400, 400);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); new Thread(tl).start();
    } @Override
    public void run() {
    // TODO Auto-generated method stub
    Graphics graphics = canvas.getGraphics();
    try {
    for (int i = 0; i < 10; i++) {
    X = 10;
    Y = 10 * (i + 1);
    Width = 100;
    Height = 10 * (i + 1);
    paintComponent(graphics);
    Thread.sleep(3000);
    }
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
      

  2.   

    画线的逻辑放在paintComponent,另起一个线程来修改线的坐标再调JComponent的repaint()就行了