如题,看代码import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class Test1 extends JPanel implements MouseListener,MouseMotionListener {


private Graphics2D g;

private int x_last=0, y_last=0;
private boolean isDragging = false;

private BasicStroke curve_stroke = new BasicStroke(1.5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND );
public static void main(String args[]) {
try {
JFrame f = new JFrame();
f.setBounds(100, 100, 500, 375);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


Test1 frame = new Test1();
frame.addMouseMotionListener(frame);
frame.addMouseListener(frame);


f.add(frame);
f.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
} public Test1() {
super();

final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
repaint();
}
});
button.setText("Paint");
add(button, BorderLayout.SOUTH);

//
}
public void update(Graphics g_){
super.update(g_);
}
public void paint(Graphics g_){
super.paint(g_);
}
public void paintComponent(Graphics g_){
super.paintComponent(g_);
} public void mousePressed(MouseEvent event) {
x_last = event.getX();
y_last = event.getY();

if(event.getButton()==MouseEvent.BUTTON1){
isDragging = true;
if(g==null){
g = (Graphics2D)getGraphics();
}
g.setXORMode(getBackground());
g.setPaint(Color.RED);
g.setStroke(curve_stroke);
setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
}
}

public void close(){
if(g!=null){
g.dispose();
g=null;
}
}
public void mouseDragged(MouseEvent event) {
if(isDragging){
repaint();
g.drawLine(x_last, y_last-3, x_last, y_last+3);
g.drawLine(x_last+1, y_last, event.getX()-2, y_last);
g.drawLine(event.getX(), y_last-3, event.getX(), y_last+3);
}
}

public void mouseReleased(MouseEvent event) {
if(isDragging){
g.drawLine(x_last, y_last-3, x_last, y_last+3);
g.drawLine(x_last+1, y_last, event.getX()-2, y_last);
g.drawLine(event.getX(), y_last-3, event.getX(), y_last+3);
isDragging = false;
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
//p.repaint();
close();
}
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}}

解决方案 »

  1.   

    1.Graphics对象不要画一次初始化一次 全程只需一次
    2.mouseDragged方法中不要repaint
    3.画线不要覆盖,如果需要实现边拖曳边画线的效果,用连接线段的方法,每次drawLine的始点是上次drawLine的终点
      

  2.   

    mouseDragged方法中不要repaint 的话,会产生许多拖曳痕迹,实现不了边拖边画的效果啊~
    每次drawLine的始点是上次drawLine的终点,这样不行我是想画直线的.
      

  3.   

    干嘛不用双缓冲啊,先划到bufferedimage再显示啦!
    或者如果画n条曲线的话双缓冲更好使啊,画上次的缓冲图像,再画下一条线就可以了。
    或者ignoreRepaint true然后再设成false
    .......,再或者就是你虚拟内存不够
      

  4.   

    bufferedimage .... 不会呢
      

  5.   

    代码太乱
    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Cursor;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;public class Test2 extends JPanel implements MouseListener,MouseMotionListener {
        
        
        private Graphics2D g;
        
        private int x_first,y_first, x_last, y_last=0;
        
        private boolean isDragging = false;
        
        private BasicStroke curve_stroke = new BasicStroke(1.5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND );
        public static void main(String args[]) {
            try {
                JFrame f = new JFrame();
                f.setBounds(100, 100, 500, 375);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                
                
                Test2 frame = new Test2();
                frame.addMouseMotionListener(frame);
                frame.addMouseListener(frame);
                
                
                f.add(frame);
                f.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }    public Test2() {
            super();
            
            final JButton button = new JButton();
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                 repaint();
                }
            });
            button.setText("Paint");
            add(button, BorderLayout.SOUTH);
            
            
        }
        public void update(Graphics g_){
            super.update(g_);
        }
        public void paint(Graphics g_){
            super.paint(g_);
        }
        public void paintComponent(Graphics g_){
            super.paintComponent(g_);
           g_.drawLine(x_first, y_first, x_last, y_last);
        }    public void mousePressed(MouseEvent event) {
            x_first = event.getX();
            y_first = event.getY();
            
            if(event.getButton()==MouseEvent.BUTTON1){
                isDragging = true;
                if(g==null){
                    g = (Graphics2D)getGraphics();
                }
                g.setXORMode(getBackground());
                g.setPaint(Color.RED);
                g.setStroke(curve_stroke);
                setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
            }
        }
        
        public void close(){
            if(g!=null){
                g.dispose();
                g=null;
            }
        }
        public void mouseDragged(MouseEvent event) {
            if(isDragging){
              x_last=event.getX();
              y_last=event.getY();
                repaint();
              //  g.drawLine(x_first, y_first, x_last, y_last);
               // g.drawLine(x_last+1, y_last, event.getX()-2, y_last);
               // g.drawLine(event.getX(), y_last-3, event.getX(), y_last+3);
            }
        }
        
        public void mouseReleased(MouseEvent event) {
            if(isDragging){
                // g.drawLine(x_last, y_last-3, x_last, y_last+3);
               //  g.drawLine(x_last+1, y_last, event.getX()-2, y_last);
              //  g.drawLine(event.getX(), y_last-3, event.getX(), y_last+3);
                isDragging = false;
                setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                close();
            }
        }
        public void mouseClicked(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
        public void mouseMoved(MouseEvent e) {     }}
      

  6.   

    非常感谢rongyunsheng不用说了,100分是你的