我们可以对已完成的画图板进行修饰,今天主要是添加一些新的功能。
一、绘制曲线
绘制曲线的思路与绘制直线类似,需要用到MouseMotionListener。
- 首先添加按钮“曲线”,此时,我们for循环添加按钮的优势便体现出来了,只需要在textArr[]中添加即可。
// 添加组件(按钮)
String textArr[] = {"改变粗细", "直线","曲线", "点", "迭代" ,"平面山水画","地貌图"};
for (String text : textArr) {
JButton btn = new JButton(text);
Dimension botton = new Dimension(100, 30);
btn.setPreferredSize(botton);
ui.add(btn);
btn.addActionListener(mousel);
}
- 设置监听器,需要注意,之前使用的是MouseListener,即便我们将MouseMotionListener和MouseListener都放在同一个类中实现,在给窗体或者组件添加监听器时也要分别添加
MyListener mousel = new MyListener();
ui.addMouseListener(mousel);
ui.addMouseMotionListener(mousel);
- 实现监听器中的MouseDragged方法,这个监听器只要鼠标按下,就会一直循环,不需要额外再添加循环语句了。
public void mouseDragged(MouseEvent e) {
if (bottonText.equals("曲线")) {
g.fillOval(e.getX(), e.getY(), r, r);
}
}
输出结果
尽管实现了绘制曲线的功能,还是有问题存在。MouseDragged方法返回坐标值太慢了,如果我们加快绘制速度,就会出现曲线间断的情况。
二、改变线条和点的粗细
我们使用的是fillOval方法来绘制点和部分线条的,对于这些图案,我们可以通过改变半径r来改变点和线条的粗细。
if (r > 20)
r -= 20;
else
r += 5;
我们通过设置最大值和变化区间来控制半径r的变化,这样可以实现多个档位的变化。
输出结果
接下来,我还会尝试使用GridBagLayout 类中的滑动条实现相对平滑的调节大小。
三、添加菜单栏
我们暂时只是添加菜单栏组件,功能的实现会放在后面的博客中。
需要使用的是JMenuBar、JMenu和JMenuItem三个类。
与添加按钮的方式相同,我们使用for循环进行相同组件的添加,方便以后的修改。
//添加菜单栏
JMenuBar menubar = new JMenuBar();
ui.setJMenuBar(menubar);
//设置菜单和子菜单文本
String MenuTextArr[] = { "文件", "编辑", "帮助" };
String MenuItem[][] = { { "新建文件", "打开文件", "保存文件", "关闭文件" }, { "清空", "撤销" }, { "使用说明", "制作人员" } };
//添加菜单和子菜单
for (int i=0;i<MenuTextArr.length;i++) {
JMenu menu = new JMenu(MenuTextArr[i]);
//将子菜单添加到对应菜单上
for(int j=0;j<MenuItem[i].length;j++) {
JMenuItem subMenu=new JMenuItem(MenuItem[i][j]);
subMenu.addActionListener(mousel);
menu.add(subMenu);
}
//将菜单添加到菜单栏上
menubar.add(menu);
}