首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

在Jpanel中如何不让窗口重绘

2012-01-07 
在Jpanel中怎么不让窗口重绘简单的画图程序,我在画图时记住点,重绘时在画一遍,好像不行,帮忙看看,有什么好

在Jpanel中怎么不让窗口重绘
简单的画图程序,我在画图时记住点,重绘时在画一遍,好像不行,帮忙看看,有什么好办法?
import   java.awt.*;
import   javax.swing.*;
import   java.awt.event.*;
public   class   ScribbleDemo   extends   JFrame   {
    public   ScribbleDemo()   {
        //   Create   a   PaintPanel   and   add   it   to   the   content   pane
        getContentPane().add(new   ScribblePanel(),   BorderLayout.CENTER);
    }

    /**   Main   method   */
    public   static   void   main(String[]   args)   {
        ScribbleDemo   frame   =   new   ScribbleDemo();
        frame.setTitle( "ScribbleDemo ");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300,   300);
        frame.setVisible(true);
    }
}

//   ScribblePanel   for   scribbling   using   the   mouse
class   ScribblePanel   extends   JPanel
        implements   MouseListener,   MouseMotionListener   {
    final   int   CIRCLESIZE   =   20;   //   Circle   diameter   used   for   erasing
    private   Point   lineStart   =   new   Point(0,   0);   //   Line   start   point
   
    Point   []p1=new   Point[200];
    int   i=0;
    protected   void   paintComponent(Graphics   g)
    {
    super.paintComponent(g);
        Point   start=p1[0];
        Point   end=new   Point();
        for(int   l=1;l <i;i++)
        {
          end=p1[l];
          g.drawLine(start.x,start.y,end.x,end.y);
          start=p1[l];
        }
      }
    public   ScribblePanel()   {
        //   Register   listener   for   the   mouse   event
        addMouseListener(this);
        addMouseMotionListener(this);
    }

    public   void   mouseClicked(MouseEvent   e)   {
    }

    public   void   mouseEntered(MouseEvent   e)   {
    }

    public   void   mouseExited(MouseEvent   e)   {
    }

    public   void   mouseReleased(MouseEvent   e)   {
    }

    public   void   mousePressed(MouseEvent   e)   {
        lineStart.move(e.getX(),   e.getY());
        p1[i]=lineStart;
        i++;
    }

    public   void   mouseDragged(MouseEvent   e)   {
        //   Create   a   Graphics   object   for   drawing
        Graphics   g   =   getGraphics();



        if   (e.isMetaDown())   {   //   Detect   right   button   pressed
            //   Erase   the   drawing   using   an   oval
            g.setColor(getBackground());
            g.fillOval(e.getX()   -   (CIRCLESIZE   /   2),
                  e.getY()   -   (CIRCLESIZE   /   2),   CIRCLESIZE,   CIRCLESIZE);
        }
        else   {
            g.setColor(Color.black);
            g.drawLine(lineStart.x,   lineStart.y,
                e.getX(),   e.getY());
        }
       
        lineStart.move(e.getX(),   e.getY());
        p1[i]=lineStart;
        i++;
        //   Dispose   this   graphics   context
        g.dispose();
    }

    public   void   mouseMoved(MouseEvent   e)   {
    }
}


[解决办法]
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class ScribbleDemo extends JFrame {
Image img = null;
Graphics og = null;//just for buffer,双缓冲
public ScribbleDemo() {
// Create a PaintPanel and add it to the content pane
getContentPane().add(new ScribblePanel(), BorderLayout.CENTER);
}

public void paint(Graphics g) {
if (og != null) {
g.drawImage(img, 0, 0, this);
}
}

/** Main method */
public static void main(String[] args) {
ScribbleDemo frame = new ScribbleDemo();
frame.setTitle( "ScribbleDemo ");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}

// ScribblePanel for scribbling using the mouse
class ScribblePanel extends JPanel implements MouseListener,
MouseMotionListener {
final int CIRCLESIZE = 20; // Circle diameter used for erasing
private Point lineStart = new Point(0, 0); // Line start point

Point[] p1 = new Point[200];
int i = 0;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Point start = p1[0];
Point end = new Point();
for (int l = 1; l < i; i++) {
end = p1[l];
g.drawLine(start.x, start.y, end.x, end.y);
start = p1[l];
}
}

public ScribblePanel() {
// Register listener for the mouse event
addMouseListener(this);
addMouseMotionListener(this);
}

public void mouseClicked(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mousePressed(MouseEvent e) {


lineStart.move(e.getX(), e.getY());
p1[i] = lineStart;
i++;
}

public void mouseDragged(MouseEvent e) {
// Create a Graphics object for drawing
Graphics g = getGraphics();

if (e.isMetaDown()) { // Detect right button pressed
// Erase the drawing using an oval
g.setColor(getBackground());
g.fillOval(e.getX() - (CIRCLESIZE / 2),
e.getY() - (CIRCLESIZE / 2), CIRCLESIZE, CIRCLESIZE);
//内存中同样缓冲------------------------------------------------
Dimension dim = this.getSize();
img = this.createImage(dim.width,dim.height);
og = img.getGraphics();
og.setColor(getBackground());
og.fillOval(e.getX() - (CIRCLESIZE / 2),
e.getY() - (CIRCLESIZE / 2), CIRCLESIZE, CIRCLESIZE);
//------------------------

} else {
g.setColor(Color.black);
g.drawLine(lineStart.x, lineStart.y,
e.getX(), e.getY());
//------------------------------------------
Dimension dim = this.getSize();
img = this.createImage(dim.width,dim.height);
og = img.getGraphics();

og.setColor(Color.black);
og.drawLine(lineStart.x, lineStart.y,
e.getX(), e.getY());
//------------------------------------------
}

lineStart.move(e.getX(), e.getY());
p1[i] = lineStart;
i++;
// Dispose this graphics context
g.dispose();
}

public void mouseMoved(MouseEvent e) {
}

}
}

热点排行