仿Windows XP 画图板

   仿照 WindowsXP 画图板  创建一个窗体,将窗体分为三个部分,左,右,下。
   左半部分,放置可以绘制的图形选项,如,直线,椭圆,三角形之类的图形按钮,以供选择。                   右半部分,就是画布了,可以在上面绘制图形。下半部分是颜色选择器。
   具体的实现就是添加三个面板,分别为,left,right,low.
   使用FlowLayout布局方式,这时就要注意计算好各个面板的大小。
 
首先,定义一个窗体,窗体可以继承JFrame。对其设定大小 setSize(宽,高),窗体的名字setTitle(""), 设置点击关闭按钮式窗体的运行方式:setDefaultCloseOperation().注意的是,在添加完所有的按钮,图片之后,要设置窗体可见:setVisible(true)。

      对左边面板的具体实现是,在 JButton 上添加对应形状的图片。为了使图片大小和按钮大小相适应,这时,就要设置按钮的大小。Dimension butSize = new Dimension(20, 20);这时设置按钮大小为20*20像素。然后在按钮上添加图片,这时就要用到javax.swing.ImageIcon。例如
Button上添加图片Line。ImageIcon  im=new ImageIcon("图片地址\\图片名称.jpg);图片各级地址之间注意用\\. final JButton Button=new JButton(im);
                Button.setPreferredSize(butSize);//这时把按钮Button设置为已经设置好的butsize大小。 添加按钮图片,就会依次性排列。

     右面板就是画布了,在上面绘制图形。
     下面板就是颜色选择器,可以选择各种颜色。(现在还没添加,以后会补充)。
     主义的一点是,对窗体设置大小时使用setSize,而对添加在窗体上的面板等其他的组件,就要用setPreferredSize。如,定义做面板的大小  left.setPreferredSize(new Dimension(50, 200));
    
      总体的布局设置好后,就是对事件的实现了。
      我们希望的结果是,点击一个按钮后,就可以在画布上绘制相对应的形状。这时就要对按钮和画布设置监听了。
      对按钮添加监听就是,是否点击了这个按钮,点击哪个按钮?这时就要用到ActionListener。 ActionListener是一个接口,我们需要对其进行实现。可以创建一个实现类,来实现里面的方法。为了知道,鼠标点击了哪个按钮,我们可以再实现类里定义一个Type属性 ,Type就是表示到底要绘制哪一个图形。实现ActionListener里面的方法就是对事件的一种处理方法 public void actionPerformed(ActionEvent e) {}actionPerformed里有两个
//e.getSource();//得到事件源对象
//e.getActionCommand();//得到事件源上的动作命令,如果没有设置动作命令,则获取事件源上的文本值。
这时,使用时可以对按钮进行setActionCommand,,这就是设置点击按钮是的命令。然后在actionPerformed方法里,getActionCommand,得到动作命令。使Type=e.getActionCommand,这时得到用户想要绘制的形状。

       得到用户想要绘制的形状后,需要在画布上绘制出。这时就要对画布进行监听。对画布监听使用的是MouseListener,因为我们是使用鼠标在画布上进行绘图,这时需要知道鼠标的活动,位置。同样需要实现类。我们需要知道,鼠标第一次按下去时的位置坐标,鼠标释放时的位置坐标。根据两点的位置绘制图形。在对按钮监听时,我们得到了Type属性,在鼠标监听里需要将其传入。(这一点是我第一次写时,特别纠结的一个地方,怎么将两个监听联系起来,怎么在鼠标监听里获得按钮上的命令~ ~)
   
       因为我们要绘制的图形不仅仅是一个,而且还要对不同的图形进行保存,而这些图形的绘制方法中有一些共同的部分,因此,我们可以定义一个抽象的Shape类,在Shape类里面定义一些子类必须使用的方法就好了。(这是我最没想到的地方,要学习的地方)
     
       如果不对图形进行保存,那么,在对画图板进行改变大小时,我们绘制的图形就要消失了,所以需要定义一个数据结构去保存我们的数据。这时,我们选择了队列。队列的好处是可以改变长度,因为我们绘制的图形个数是不确定的,选择数组是不行的。对图形进行保存后,再对画图板最大最小画后,我们绘制的图形就可以保存了。     在JFrame里面有一个paint方法,是每次窗体会自动调用的,我们只要对paint方法进行重写,让其每次调用时都重新绘制一遍我们曾经绘制过的图形,那么,在我们眼睛看来,绘制过的图形就一直在那里,没有丢失了。因为我们将绘制过的图形保存在了队列里面,那么,在paint方法里添加对队列的遍历,显示所有的形状就好了。
      下面是我初步写好的画图板,还需要继续完善:
仿Windows XP 画图板



      

      
      

     

你可能感兴趣的:(数据结构,windows,swing,qq,XP)