Java制作画图板(阶段二)

①  Panel是一个面板类,用于将窗体分为几个模块,把窗体上的组件分到各个模块中,

           JPanel draw_panel = new JPanel();//创建画图面板

           //添加面板到窗口

frame.add(draw_panel);

 

②    写画图板的画笔和橡皮时需要按住拖动鼠标来画出鼠标移动轨迹,需要用MouseMotionListener中的方法

//添加鼠标移动监听对象

          MouseMotionListener motion_listener = new MouseMotionListener()

          {

               public void mouseDragged(MouseEvent e) {//鼠标拖拽时触发事件

               }

               public void mouseMoved(MouseEvent e) {//鼠标移动时触发事件

               }

          };


③   创建同类按钮对象可用循环写,使代码更简洁。


④   调用按钮类的setActionCommand方法可以给按钮设置标记来区分同名的不同功能按钮。

//创建颜色数组

Color[]color = {Color.red,Color.pink,Color.orange,Color.yellow,Color.green,Color.blue,

                newColor(100,100,200),Color.black,Color.gray,Color.white};

for(int i=0;i<10;i++)

          {             

JButton jbt_color = new JButton();//创建按钮

               jbt_color.setBackground(color[i]);//设置按钮颜色

               jbt_color.setPreferredSize(new Dimension(26,26));//设置按钮大小

               jbt_color.setActionCommand("颜色"+i);//每个按钮设置不同的指令信息

               color_panel.add(jbt_color);//添加颜色按钮到颜色面板

               jbt_color.addActionListener(color_listener);//给颜色按钮添加监听对象

       }   


⑤   在颜色按钮的动作监听事件中, 创建一个按钮对象保存点击的按钮,用按钮类的getBackground方法获取给按钮的背景颜色,从而把颜色按钮的颜色传给画笔。

JButton jbt = (JButton)e.getSource();//创建一个按钮对象来保存点击的按钮

g.setColor(jbt.getBackground());//获得按钮的背景颜色并用来改变画笔颜色


⑥ 画笔的实现方法,通过在鼠标拖动过程中不断画相邻两点的线段构成自定义的线条。

(刷子和橡皮的实现方法相似。)

public void mouseDragged(MouseEvent e) {//鼠标拖拽时的方法

                  x2 = e.getX();

                  y2 = e.getY();

                  if(cmd.equals("按钮7"))//当点击的按钮为画笔

                  {

                      //逐点画线

                      g.drawLine(x1,y1,x2,y2);

                      x1=x2;

                      y1=y2;

                  }

}


代码只完成 画笔、橡皮、画线段、椭圆、矩形、圆角矩形、选色功能


package com.huaxin.Draw;

import javax.swing.*;//引用窗体类包
import java.awt.*;//引用流式布局和监听器的包
import java.awt.event.*;//引用事件类的包


//定义画板类
class Draw{
	Graphics g = null;//定义画笔
	String cmd ="按钮11";//创建图形标记
	String cmd2 ="黑色";//创建颜色按钮标记 
	int x1,x2,y1,y2,x3,y3;//创建点位坐标
	
	//主函数
	public static void main(String[] args){
		//创建画板对象
		Draw draw = new Draw();//创建画板对象
		draw.showUI();//调用展示界面的方法
	}
	public void showUI()
	{
		JFrame frame = new JFrame("画板");//创建窗体
		frame.setSize(500,500);//设置窗体大小
		frame.setLocation(300,100);//设置窗体位置
		FlowLayout layout = new FlowLayout();//创建线性布局对象
		frame.setLayout(layout);//设置窗体为线性布局
		JPanel draw_panel = new JPanel();//创建画图面板
		JPanel color_panel = new JPanel();//创建颜色选择面板
		JPanel shape_panel = new JPanel();//创建形状选择面板
		
		//添加面板到窗口
		frame.add(shape_panel);
		frame.add(draw_panel);
		frame.add(color_panel);
		
		//设置面板颜色
		shape_panel.setBackground(Color.blue);
		draw_panel.setBackground(Color.WHITE);
		color_panel.setBackground(Color.green);

		//设置面板大小
		shape_panel.setPreferredSize(new Dimension(80,370));	
		draw_panel.setPreferredSize(new Dimension(370,370));
		color_panel.setPreferredSize(new Dimension(470,50));
		

		
		//创建颜色数组
		Color[] color = {Color.red,Color.pink,Color.orange,Color.yellow,Color.green,Color.blue,
				new Color(100,100,200),Color.black,Color.gray,Color.white};

		//创建按钮动作监听对象
		ActionListener action_listener = new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				cmd = e.getActionCommand();//获取按钮上的指令
				System.out.println(cmd);

			}
		};
		
		//颜色按钮动作监听对象
		ActionListener color_listener = new ActionListener()
		{
			
			public void actionPerformed(ActionEvent e)
			{
				cmd2 = e.getActionCommand();//获取按钮上的指令
				System.out.println(cmd2);
				
				//判断点击颜色按钮的信息,将画笔设置为相应颜色
				if(!(cmd2.equals("更多"))){
					JButton jbt = (JButton)e.getSource();//创建一个按钮对象来保存点击的按钮
					g.setColor(jbt.getBackground());//获得按钮的背景颜色 并用来改变画笔颜色 
				}
				if(cmd2.equals("更多"))
				{
					Color DIYcolor = JColorChooser.showDialog(null, "更多颜色", Color.black);
					g.setColor(DIYcolor);
				}
			}
		
		};
		
		//创建形状按钮
		for(int i=1;i<=16;i++)
		{
			
			JButton jbt_shape = new JButton();//创建按钮
			ImageIcon icon = new ImageIcon("image//"+i+"-1.png");//创建图标对象
			jbt_shape.setIcon(icon);//设置按钮图标
			jbt_shape.setPreferredSize(new Dimension(26,26));//设置按钮大小
			jbt_shape.setActionCommand("按钮"+i);
			shape_panel.add(jbt_shape);//添加形状按钮到面板
			jbt_shape.addActionListener(action_listener);//给形状按钮添加监听对象
		}
		
		//创建颜色按钮对象
		for(int i=0;i<10;i++)
		{
			
			JButton jbt_color = new JButton();//创建按钮
			jbt_color.setBackground(color[i]);//设置按钮颜色
			jbt_color.setPreferredSize(new Dimension(26,26));//设置按钮大小
			jbt_color.setActionCommand("颜色"+i);//每个按钮设置不同的指令信息
			color_panel.add(jbt_color);//添加颜色按钮到颜色面板
			jbt_color.addActionListener(color_listener);//给颜色按钮添加监听对象
		}	
		
		//创建自定义颜色按钮对象
		JButton jbt_DIYcolor = new JButton("更多");
		color_panel.add(jbt_DIYcolor);//添加到面板
		jbt_DIYcolor.addActionListener(color_listener);//给颜色按钮添加监听对象
		
		//创建鼠标监听事件对象
		MouseListener mouse_listener = new MouseListener(){
			public void mouseEntered(MouseEvent e){//鼠标进入时
			}
			public void mouseExited(MouseEvent e){//鼠标移出时
			}
			public void mouseClicked(MouseEvent e){//鼠标点击时
			}
			public void mousePressed(MouseEvent e){//鼠标按住时
				x1=e.getX();//获取按住时的点位
				y1=e.getY();
			}
			public void mouseReleased(MouseEvent e){//鼠标释放时
				x2=e.getX();//获取释放时的点位
				y2=e.getY();
				if(cmd.equals("按钮11")){//判断所选按钮信息
					g.drawLine(x1,y1,x2,y2);
					//画直线
				}
				if(cmd.equals("按钮13")){
					g.drawRect((x1+x2)/2-Math.abs(x2-x1)/2,(y1+y2)/2-Math.abs(y2-y1)/2,Math.abs(x2-x1),Math.abs(y2-y1));
					//画矩形
				}
				if(cmd.equals("按钮15")){
					g.drawOval((x1+x2)/2-Math.abs(x2-x1)/2,(y1+y2)/2-Math.abs(y2-y1)/2,Math.abs(x2-x1),Math.abs(y2-y1));
					//画椭圆
				}
				if(cmd.equals("按钮16"))
				{
					//画圆角矩形
					g.drawRoundRect((x1+x2)/2-Math.abs(x2-x1)/2,(y1+y2)/2-Math.abs(y2-y1)/2,
							Math.abs(x2-x1),Math.abs(y2-y1),Math.abs(x2-x1)/5,Math.abs(y2-y1)/5);
				}

			}

		};
		
		//添加鼠标移动监听对象
		MouseMotionListener motion_listener = new MouseMotionListener()
		{
			public void mouseDragged(MouseEvent e) {//鼠标拖拽时的方法
				x2 = e.getX();
				y2 = e.getY(); 
				if(cmd.equals("按钮7"))//当点击的按钮为画笔
				{
					//逐点画线
					g.drawLine(x1,y1,x2,y2);
					x1=x2;
					y1=y2;
				}

				if(cmd.equals("按钮8"))//当点击的按钮为刷子
				{
					//逐点画线
					g.drawOval((x1+x2)/2-Math.abs(x2-x1)/2,(y1+y2)/2-Math.abs(y2-y1)/2,5,5);
					g.fillOval((x1+x2)/2-Math.abs(x2-x1)/2,(y1+y2)/2-Math.abs(y2-y1)/2,5,5);
					x1=x2;
					y1=y2;
				}
				if(cmd.equals("按钮3"))//当点击按钮为橡皮
				{
					//画白色圆形
					g.setColor(Color.white);
					g.drawOval((x1+x2)/2-Math.abs(x2-x1)/2,(y1+y2)/2-Math.abs(y2-y1)/2,30,30);
					g.fillOval((x1+x2)/2-Math.abs(x2-x1)/2,(y1+y2)/2-Math.abs(y2-y1)/2,30,30);
					x1=x2;
					y1=y2;
				}
				
			}

			public void mouseMoved(MouseEvent e) {//鼠标移动时实现方法
				
			}
			
		};
		
		//给画图面板添加鼠标监听对象和鼠标移动监听对象
		draw_panel.addMouseListener(mouse_listener);
		draw_panel.addMouseMotionListener(motion_listener);

		frame.setDefaultCloseOperation(3);//设置默认关闭操作
		frame.setVisible(true);//设置窗体可见
		g = draw_panel.getGraphics();//获取编辑面板的画笔!	
		
	}
};



1. 画板UI设计(总体布局) (1)创建窗体并设置相关属性; (2)给整个窗体添加一个中间容器用来覆盖整个窗体; (3)设置边框布局,因为整个画板大致为左边部分,中间部分,菜单栏三个部分,用边框布局比较合适; (4)给窗体添加左面板,中间面板; (5)给左面板添加按钮,并设置按钮图片和效果; (6)给左面板添加左子面板,用来存放颜色按钮; 2.画板功能设计 (1)给左画板中的按钮组中的每个按钮添加鼠标监听器; (2)点击不同按钮,绘制不同的图形; (3)给左子面板中的每个颜色按钮添加鼠标监听器; (4)根据下面板中选中的颜色按钮,来获取按钮的背景颜色,并将该颜色设置成画笔的颜色; (5)铅笔功能 1、铅笔是鼠标拖动时画的线,所需要实现鼠标移动监听器,我们采用一个类来实现多个接口; 2、添加新的鼠标监听器类; 3、在鼠标移动时间中实现画笔的逻辑(其实就是绘制直线,鼠标每移动一个像素,就会触发移动事件,通过移动事件获取鼠标的坐标,与上一次移动的坐标连线就可以了; (6)刷子功能 刷子其实就是加粗的画笔,画出来的直线更粗,这里需要用到Graphic2D画笔来设置画笔的粗细。 (7)橡皮擦功能 橡皮擦就是把画笔颜色设置成相同的背景颜色就可以了,拖动鼠标时进行擦除,所以在鼠标拖动事件中编写。 (8)喷桶功能 1、定位方法:鼠标拖动事件实现; 2、随机数生成:Random; 3、实现原理,在鼠标拖动附近绘制很多的原点; 3. 画板的保存和重绘的设计 (1)给我们的画板添加菜单条、菜单以及菜单项 (2)给每个菜单项添加监听器 (3)点击不同的菜单项实现相应的功能 (4)图形保存功能:利用对象输出流,将容器对象写入文件; (5)打开图形功能:利用对象输入流,将容器对象读入,然后将容器里面的图形对象在画板上绘制出来 (6)新建文件功能:新建文件,将画板上绘制的内容清空(清空之前可以确认是否需要进行保存)清屏(重绘)功能依次方法; (7)文件保存格式为BMP格式; (8)文字功能:读取文本框中的文本并打印到屏幕鼠标的相应的响应位置,传入输入的文字大小的参数,以此来改变文字的大小; 4.弹泡泡功能的设计 根据Java多线程来实现弹泡泡功能;泡泡的位置颜色随机出现,并且做到碰到边框会变色;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值