我这个画板程序有好多问题,我要画连续的直线,也就是鼠标点一下,就从上一个点到刚才点击的地方的两点之间画一条直线,但是却总是从同一个点引直线,请问是什么问题,还有就是,当我窗口最大化,最小化时,怎么图像没有了?如何解决!?import javax.swing.*; 
import java.awt.*; 
import java.awt.Component.*;
import java.awt.event.*; 
import java.awt.image.*;public class dr extends JFrame implements ActionListener{ 
JButton close; 
JButton line;
JButton zline;
JButton sline;
JPanel p,p1;
JMenuBar m;
JMenu m1,m2,m3,m4;
JMenuItem m11,m12,m13,m14,m21,m22,m23,m31,m32,m41,m42;
//////////////////////////////////////////////////////////////////
 class MOUSEMOVE2 implements MouseMotionListener{     ///  鼠标  /  
public void mouseMoved(MouseEvent e){         ///        /  
                                              ///  拖动  /
}                                             ///        /
public void mouseDragged(MouseEvent e){       ///        /
Graphics g=getGraphics();  {          ///    画线/
       int x=1,y=9;int a=1,b=1;               ///        /
x=e.getX();y=e.getY();  
                g.setColor(Color.blue);               ///        /
g.drawLine(a,b,x,y);                  ///        /
a=x;b=y;                        ///   的   /
                                       ///        /
}                                     ///        /
}                                             ///   类   /
}                                               ///        /
/////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
 class MOUSEMOVE implements MouseMotionListener{      ///  鼠标  /  
public void mouseMoved(MouseEvent e){         ///        /  
                                              ///  拖动  /
}                                             ///        /
public void mouseDragged(MouseEvent e){       ///        /
Graphics g=getGraphics();             ///  画虚线/
int c=0,d=1300;                       ///        /
c=e.getX();d=e.getY();                ///        /
if(c>=100&&d<=500&&d>=60){            ///        /
g.setColor(Color.red);        ///   的   /
         g.drawRect(c,d,1,1);          ///        /
}                                     ///        /
}                                             ///   类   /
}                                               ///        /
/////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
class   MouseC   extends MouseAdapter implements   MouseListener  {  ///  鼠标     /
                public   void   mouseClicked(MouseEvent   e)   {     ///           /
                Graphics g=getGraphics();                            ///  点击画   /
  int a=10,b=10;int a1=0,b1=0;                       ///           /
                                                     ///   连续    /
a1=e.getX();b1=e.getY();                             ///           /
g.drawLine(a,b,a1,b1);                               ///    直线   /
                a1=a;b1=b;                                           ///           /
  }                                                          ///   的类    /
  }                                                                  ///           /
///////////////////////////////////////////////////////////////////////////////////就是这个类有问题!
public dr(){ 
        line= new JButton("----");
line.setBounds(10,100,50,50);
line.setForeground(Color.blue);
line.setBackground(Color.pink);
zline= new JButton("____");
zline.setBounds(10,300,50,50);
zline.setForeground(Color.black);
zline.setBackground(Color.pink);
sline= new JButton("***");
sline.setBounds(10,400,50,50);
sline.setForeground(Color.black);
sline.setBackground(Color.pink);
close=new JButton("x");
close.setBounds(10,200,50,50);
close.setForeground(Color.red);
close.setBackground(Color.pink);
p=new JPanel();
p1=new JPanel();
p.setBounds(0,0,70,700);
p.setBackground(Color.yellow);
p1.setBounds(20,500,1200,200);
p1.setBackground(Color.yellow);
add(p1);
add(p);
p.add(sline);
p.add(zline);
p.add(close); 
p.add(line);
m=new JMenuBar();
setJMenuBar(m);
m1=new JMenu("文件");
m2=new JMenu("编辑");
m3=new JMenu("工具");
m4=new JMenu("帮助");
m.add(m1);
m.add(m2);
m.add(m3);
m.add(m4);
m11=new JMenuItem("新建");
m12=new JMenuItem("打开");
m13=new JMenuItem("保存");
m14=new JMenuItem("页面设置");
m1.add(m11);
m1.add(m12);
m1.add(m13);
m1.add(m14);
m21=new JMenuItem("撤销");
m22=new JMenuItem("重复");
m23=new JMenuItem("全选");
m2.add(m21);
m2.add(m22);
m2.add(m23);
m31=new JMenuItem("颜料盒");
m32=new JMenuItem("工具箱");
m3.add(m31);
m3.add(m32);
m41=new JMenuItem("关于画图板");
m42=new JMenuItem("帮助主题");
m4.add(m41);
m4.add(m42);    //------------------设置监听器(按钮)--------------------------//
close.addActionListener(this);
line.addActionListener(this);
zline.addActionListener(this);
sline.addActionListener(this);
   ////////////////////////////////////////////////////////////////
setLayout(null); 
p.setLayout(null);
setTitle("~~~~~~~~~画板~~~~~~~~~");
setSize(400,600); 
setVisible(true); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //----------------事件判断及其处理--------------------------// 
public void actionPerformed(ActionEvent e){ 
if(e.getSource()==close) dispose();
else if(e.getSource()==line){

this.addMouseMotionListener(new MOUSEMOVE());
}
else if(e.getSource()==zline){
this.addMouseListener(new MouseC());
}
else if(e.getSource()==sline){
this.addMouseMotionListener(new MOUSEMOVE2());
}

     //------------------------主控函数-------------------------------///
public static void main(String[] args){ 
new dr(); 

}

解决方案 »

  1.   

    你在绘制的时候,只是通过鼠标进行了绘制,可是,只要屏幕出现刷新,你的绘制就会丢失,你应该把绘制放在paint 方法中,你的画板可以看作是一个容器,当你点击鼠标绘制时,就是记录绘制的是线条还是其他类型,并记录鼠标的x,y坐标,将这些坐标放到集合中,并在paint方法中绘制集合中的对象
      

  2.   

    以下是绘制 方法:class myframe extends JFrame
    {
       //定义一个当前绘制类型
        int LINE = 0;
        int RECT = 1;
        int currentShape;//在菜单或者按钮事件中将次值设置为合适的绘制类型
        Vector v = new Vector();//将要绘制的集合    public void paint(Graphics g)//自动调用
        {
            //对集合进行遍历,绘制其中的对象
             for(int i = 0; i<v.size(); i++)
            {
                 v.get(i).draw(g);//每个对象自己的绘制方法
                //或者
                  g.drawXXX();//根据类型绘制型状
            }
        }    
    }绘制对象:
    abstract class Shape{
        int sx,sy;//起点
        int ex,ey;//终点
        Color c;//色彩
        public void draw(Graphics g);
    }class Line extends Shape{   public void draw(Graphics g){}
    }
      

  3.   

    我也遇到过这样的问题
    一:画出新的直线后没有把旧的直线清除,解决方案:继续Frame而不是Jframe
    二:也就是和你一样的问题,解决方案:用GeneralPath类,的moveTo(),lineTo()方法
      

  4.   

    以下是绘制 方法: class myframe extends JFrame 

       //定义一个当前绘制类型 
        int LINE = 0; 
        int RECT = 1; 
        int currentShape;//在菜单或者按钮事件中将次值设置为合适的绘制类型 
        Vector v = new Vector();//将要绘制的集合     public void paint(Graphics g)//自动调用 
        { 
            //对集合进行遍历,绘制其中的对象 
             for(int i = 0; i <v.size(); i++) 
            { 
                 v.get(i).draw(g);//每个对象自己的绘制方法 
                //或者 
                  g.drawXXX();//根据类型绘制型状 
            } 
        }     
    } 绘制对象: 
    abstract class Shape{ 
        int sx,sy;//起点 
        int ex,ey;//终点 
        Color c;//色彩 
        public void draw(Graphics g); 
    } class Line extends Shape{    public void draw(Graphics g){} 
    }
      

  5.   

    需要重绘.因为当你窗口改变时,屏幕会重新刷新和绘制所有像素点,你的图象自然会没有.
    楼主可以用一个ArrayList或Vector保存所有的画点,然后再响应重绘方法,每次当窗口改变时,将ArrayList或Vector保存的画点在重新画到画布上.