仿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属性,在鼠标监听里需要将其传入。(这一点是我第一次写时,特别纠结的一个地方,怎么将两个监听联系起来,怎么在鼠标监听里获得按钮上的命令~ :cry: ~)

因为我们要绘制的图形不仅仅是一个,而且还要对不同的图形进行保存,而这些图形的绘制方法中有一些共同的部分,因此,我们可以定义一个抽象的Shape类,在Shape类里面定义一些子类必须使用的方法就好了。(这是我最没想到的地方,要学习的地方)

如果不对图形进行保存,那么,在对画图板进行改变大小时,我们绘制的图形就要消失了,所以需要定义一个数据结构去保存我们的数据。这时,我们选择了队列。队列的好处是可以改变长度,因为我们绘制的图形个数是不确定的,选择数组是不行的。对图形进行保存后,再对画图板最大最小画后,我们绘制的图形就可以保存了。 :D 在JFrame里面有一个paint方法,是每次窗体会自动调用的,我们只要对paint方法进行重写,让其每次调用时都重新绘制一遍我们曾经绘制过的图形,那么,在我们眼睛看来,绘制过的图形就一直在那里,没有丢失了。因为我们将绘制过的图形保存在了队列里面,那么,在paint方法里添加对队列的遍历,显示所有的形状就好了。
下面是我初步写好的画图板,还需要继续完善:
[img]http://b72.photo.store.qq.com/http_imgload.cgi?/rurl4_b=9067630172f069b6ac8199dafed388b1bf291dd985e30a961a92d6f4e22cb1a50c78ab700564fdc39f486731659218f6be9f5b6be62ca3f679e4711eab0dc3eede4cf5be22160349da5a3d0d78298d539bd4fced&a=72&b=72[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值