我们可以对已完成的画图板进行修饰,今天主要是添加一些新的功能。

一、绘制曲线

    绘制曲线的思路与绘制直线类似,需要用到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);
	}
}

输出结果

Java中曲线形状 java画曲线_子菜单


    尽管实现了绘制曲线的功能,还是有问题存在。MouseDragged方法返回坐标值太慢了,如果我们加快绘制速度,就会出现曲线间断的情况。

二、改变线条和点的粗细

    我们使用的是fillOval方法来绘制点和部分线条的,对于这些图案,我们可以通过改变半径r来改变点和线条的粗细。

if (r > 20)
	r -= 20;
else
	r += 5;

我们通过设置最大值和变化区间来控制半径r的变化,这样可以实现多个档位的变化。

输出结果

Java中曲线形状 java画曲线_监听器_02


    接下来,我还会尝试使用GridBagLayout 类中的滑动条实现相对平滑的调节大小。

三、添加菜单栏

    我们暂时只是添加菜单栏组件,功能的实现会放在后面的博客中。
    需要使用的是JMenuBar、JMenu和JMenuItem三个类。

Java中曲线形状 java画曲线_Java中曲线形状_03


    与添加按钮的方式相同,我们使用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);
}