import java.awt.*;
import java.awt.event.*;import java.util.*;public class test17 extends Frame 
{
int x0,y0,x1,y1;
public test17()
{

addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
              x0 = e.getX();
              y0 = e.getY();
              
  }
public void mouseReleased(MouseEvent e)
{
x1 = e.getX();
y1 = e.getY();
repaint();
}


});
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
dispose();
}
});
this.setSize(600, 400);
this.setVisible(true);

} public void paint(Graphics g)
{


   
this.getGraphics().drawLine(x0, y0, x1, y1);
  
}
public static void main(String[] args)
{
new test17();
}
}
画第一条直线,再画另二条,第一条的直线消失了,再画第三条,第二条又消失了...
如何重绘原来画过的直线?

解决方案 »

  1.   

    this.getGraphics().drawLine(x0, y0, x1, y1);你只画了最后一条线,你可以
    将以前画过的线都保存起来,比如2个点的坐标,然后在这里全部重画
      

  2.   

    你没有保存啊,当然会被刷新掉啊!
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    public class test17 extends Frame {
    // int x0, y0, x1, y1;
    private int point[] = new int[10000];
    private int x;
    public test17() {
    addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
    point[x ++] = e.getX();
    point[x ++] = e.getY();
    } public void mouseReleased(MouseEvent e) {
    point[x ++] = e.getX();
    point[x ++] = e.getY();
    repaint();
    }
    });
    this.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    dispose();
    }
    });
    this.setSize(600, 400);
    this.setVisible(true);
    } public void paint(Graphics g) {
    for(int i = 0, len = point.length / 4; i < len; i = i + 4) {
    g.drawLine(point[i], point[i + 1], point[i + 2], point[i + 3]);
    }
    } public static void main(String[] args) {
    new test17();
    }
    }
      

  3.   

    记住:用JFrame 做父类, 画法paint(Graphics g)中 的第一句代码 super.paint(g);的作用是抹去上已幁的图画。不要这句话,则不会抹去以往的图画。你的代码,改动如下:
    ---------------------------------
    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*;public class test17 extends JFrame {  //父类改用软件包swing中的JFrame
    boolean deletePrevious = true; //是否抹去前一幁图画?
    int x0,y0,x1,y1; 
    public test17() { addMouseListener(new MouseAdapter() { 
    public void mousePressed(MouseEvent e) { 
                  x0 = e.getX(); 
                  y0 = e.getY(); 

    public void mouseReleased(MouseEvent e) { 
    x1 = e.getX(); 
    y1 = e.getY(); 
    repaint(); 

    }); 
    this.addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e) { 
    dispose(); } 
    }); 
    Container container = getContentPane();
    setSize(600, 400); 
    setVisible(true); 
    } public void paint(Graphics g){ 
    if (deletePrevious)//是否抹去前一幁图画, 若·deletePrevious 为true,则抹去。
    super.paint(g); //调用超类的画法paint(), 会抹去原先得图画,我只在生成画布时调用一次父类的paint()
    g.drawLine(x0, y0, x1, y1); 
    deletePrevious = false;   //今后不再调用父类的paint()方法,不再抹去原来的线段。 

    public static void main(String[] args) { 
    new test17(); 

      

  4.   

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;import javax.swing.JFrame;public class TankBar extends JFrame
    {
    public static final int Game_Width=800;
    public static final int Game_Height=600;
    private int x = 50, y = 50;
    Image offScreenImage = null; public TankBar()
    {
    setTitle("坦克游戏");
    setBounds(200, 200, Game_Width, Game_Height);
    init();
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    getContentPane().setBackground(Color.GREEN);
    setResizable(false); } private void init()
    {
    this.addKeyListener(new KeyMonitor());
    setVisible(true);
    new Thread(new PaintThread()).start();
    } public static void main(String[] args)
    {
    new TankBar().setVisible(true);
    } public void paint(Graphics g)
    {
    super.paint(g);
    Color c = g.getColor();
    g.setColor(Color.RED);
    g.fillOval(x, y, 30, 30);
    g.setColor(c);
    } //这段代码好像没起到作用
         public void update(Graphics g)
    {
    super.paint(g);
    if (offScreenImage == null)
    {
    offScreenImage = this.createImage(Game_Width, Game_Height);
    }
    Graphics gOffScreen = offScreenImage.getGraphics();
    Color c = gOffScreen.getColor();
    gOffScreen.setColor(Color.GREEN);
    gOffScreen.fillRect(0, 0, Game_Width, Game_Height);
    gOffScreen.setColor(c);
    paint(gOffScreen);
    g.drawImage(offScreenImage, 0, 0, null);
    } class PaintThread implements Runnable
    { public void run()
    {
    while (true)
    {
    repaint();
    try
    {
    Thread.sleep(100);
    }
    catch (InterruptedException e)
    {
    e.printStackTrace();
    }
    }
    } }

    class KeyMonitor extends KeyAdapter
    { public void keyPressed(KeyEvent e)
    {
    int key=e.getKeyCode();
    switch(key)
    {
    case KeyEvent.VK_RIGHT:
    x+=5;
    break;
    case KeyEvent.VK_LEFT:
    x-=5;
    break;
    case KeyEvent.VK_UP:
    y-=5;
    break;
    case KeyEvent.VK_DOWN:
    y+=5;
    break;

    }

    }

    }
    }
    请问我这个 闪烁的问题怎么还没有解决