`
卿黛如画
  • 浏览: 13490 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

简单的画图板总结

 
阅读更多


一、简单的画图板设计结构



 

二、简单画图板的实现结果



 三、实现过程中的主要问题

1、UI
(1)BorderLayout的使用

JFrame jf = new JFrame();
jf.setLayout(new BorderLayout());
jf.add(top,BorderLayout.NORTH);

 (2)必须在设置可见之后才可以得到画布对象

 jf.setVisible(true);
g = panel.getGraphics();

 (3)菜单栏的添加

jf.setMenuBar(db);   (正确)
jf.add(db);          (错误)

 (4)鼠标监听器的添加

panel.addMouseListener(dl);
 panel.addMouseMotionListener(dl);

 2、ShapePanel
(1)在构造方法中调用内部方法以实现

//构造方法
public ShapePanel(){
         shapepanel();
}

 (2)另外实例化一个专门放置形状选择图片的面板,GridLayout的使用

//实例化一个JPanel对象,作为形状选择的面板
 
JPanel panelshape=new JPanel();
 
//设置形状选择面板的布局为网格布局

 panelshape.setLayout(new GridLayout(3,7,3,3));

 (3)通过定义图片数组,并使用for循环结构,将图片加到形状按钮上

 //定义一个数组,包含所有形状选择的图片
      String array={"shapeimages/001.jpg","shapeimages/002.jpg","shapeimages/003.jpg","shapeimages/004.jpg",
                        "shapeimages/005.jpg","shapeimages/006.jpg","shapeimages/007.jpg","shapeimages/008.jpg",
			"shapeimages/009.jpg","shapeimages/010.jpg","shapeimages/011.jpg","shapeimages/012.jpg",
			"shapeimages/013.jpg","shapeimages/014.jpg","shapeimages/015.jpg","shapeimages/016.jpg",
			"shapeimages/017.jpg","shapeimages/018.jpg","shapeimages/019.jpg","shapeimages/020.jpg","shapeimages/021.jpg"};
      //使用循环结构方便将图片添加到按钮上
		for(int i=0;i<array.length;i++){
			//实例化ImageIcon对象,地址为数组
			ImageIcon image=new ImageIcon(array[i]);
			//实例化按钮对象,并添加图片
			JButton btn=new JButton(image);
		}

 

 (4)得到图片的名字(substring的使用),并设置按钮的命令为图片的名字

String filename=array[i].substring(array[i].indexOf("/")+1, array[i].lastIndexOf(".jpg"));
	btn.setActionCommand(filename);

 (5)设置优先大小

//设置按钮的优先选取的大小(Dimension:尺寸)
	btn.setPreferredSize(new Dimension(20,20));

 

(6)在按钮上添加得到其命令的鼠标监听器
btn.addActionListener(al);
	//定义一个监听器
	private ActionListener al=new ActionListener (){
		 public void actionPerformed(ActionEvent e){
			 //获取事件源对象
			 Object obj=e.getSource();
			 //强制转型为按钮对象
			 JButton btn=(JButton)obj;
			 //把按钮的动作命令赋值给type
			 DrawingListener.type=btn.getActionCommand();
		 }
	};
 3、ToolPanel
(1)定义了粗细的选择之后,设置弹出菜单的实现JpopupMenu的使用,show方法的调用,设置所有者
//弹出菜单的实现
		final javax.swing.JPopupMenu menu = new javax.swing.JPopupMenu();
		String[] array1 = { "images/4.jpg",  "images/5.jpg", "images/6.jpg", "images/7.jpg" };

		for (int i = 0; i < array1.length; i++) {
			ImageIcon icon = new ImageIcon(array1[i]);
			javax.swing.JMenuItem item = new javax.swing.JMenuItem(icon);
			menu.add(item);
			//substring 返回一个新字符串,它是此字符串的一个子字符串。
			String s = array1[i].substring(array1[i].indexOf("/") + 1,array1[i].lastIndexOf(".jpg"));			
			item.setActionCommand(s);
			item.addActionListener(al1);
			
		}
       		 //设置弹出菜单的所有者
		menu.setInvoker(btn2);
        	//给按钮添加监听器
		btn2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
                //设置点击按钮时,出现弹出菜单,并且设置弹出菜单的位置
				menu.show(btn2, btn2.getLocation().x-100 ,
						btn2.getLocation().y + btn2.getHeight()-10);

			}

		});
 (2)返回粗细值方法的使用
private float stroke=1;
	public float getstroke(){
		return stroke;
	}
	private ActionListener al1 = new ActionListener() {

		public void actionPerformed(ActionEvent e) {
			JMenuItem item = (JMenuItem) e.getSource();
			DrawingListener.type = item.getActionCommand();
			if(DrawingListener.type.equals("4")){
				stroke=1;
			}
			else if(DrawingListener.type.equals("5")){
				stroke=4;
			}
			else if(DrawingListener.type.equals("6")){
				stroke=7;
			}
			else if(DrawingListener.type.equals("7")){
				stroke=10;
			}

		}

	};
 4、ColorPanel
(1)鼠标进入出现红色边框的实现,LineBorder的使用
MouseListener mlis = new MouseAdapter() {
		
		public void mouseReleased(MouseEvent e) {
			JLabel label = (JLabel) e.getSource();
			color = label.getBackground();
			DrawingListener.command = "颜色面板";
		}

		public void mouseEntered(MouseEvent e) {
			JLabel label = (JLabel) e.getSource();
			label.setBorder(new LineBorder(Color.RED));

		}

		public void mouseExited(MouseEvent e) {
			JLabel label = (JLabel) e.getSource();
			label.setBorder(new LineBorder( Color.GRAY));
		}

	};
 (2)绘制边界内像素点
//如果为 true,则该组件绘制其边界内的所有像素。
	btn.setOpaque(true);
 (3)得到颜色的方法
public Color color;
	
	//定义选取得到颜色的方法
	public Color getColor(){
		return color;
	}
 5、ColorChooserPanel
(1)弹出颜色选择器
//设置按钮的监听器
	btn.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent e) {
			showcolorchooser();
			//btn.setActionCommand("选择颜色");
			DrawingListener.command="选择颜色";
		}
			
	});
	//弹出颜色选择器
	private void showcolorchooser(){
		color=JColorChooser.showDialog(null, "颜色选择器", Color.black);
	}

 (2)得到颜色的方法

private Color color;
	//得到颜色
	public Color getcolor(){
		return color;
	}

 

6、DrawingPanel
(1)重绘
//实例化一个JPanel对象,作为画布绘制的对象,并设置重绘
         public  JPanel panel=new JPanel(){
    	 //重写方法,进行重绘
    	 	public void paint(Graphics g){
			super.paint(g);
			for(int i=0;i<UI.count;i++){
				//将储存的图形一一重新绘制
			    UI.shapearray[i].shape(g);
			}
		}
         }	
 (2)得到画画面板的方法
public  JPanel getJPanel(){
		return panel;
	}
 7、DrawingListener
(1)改变面板大小,并设置鼠标光标,Cursor的使用
public void mouseEntered(MouseEvent e) {
		 
		 if ((x1 >= panel.getSize().width-50 && x1 <= panel.getSize().width) 
				||( y1 >= panel.getSize().height-50
				&& y1 <= panel.getSize().height )) {
 		//调整窗口右下角大小的光标类型。
			dp.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR));
 	
		}
		 else{
			//调整窗口光标类型还原。
				dp.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
		 }
	}

	public void mouseDragged(MouseEvent e) {
		if (x1 >= panel.getSize().width-50 
				&& x1 <= panel.getSize().width 
				&& y1 >= panel.getSize().height-50 
				&& y1 <= panel.getSize().height) {
			panel.setSize(new Dimension(x2, y2));
			panel.repaint();
			g = panel.getGraphics();
		}
	}
 (2)设置粗细
Graphics2D g2d = (Graphics2D) g;
	g2d.setStroke(new BasicStroke(tp.getstroke()));
 (3)多边形的完成
public void mouseReleased(MouseEvent e) {
	//多边形
    	if(type.equals("006")){
        	if (state) {
    			x2 = e.getX();
    			y2 = e.getY();
    			a = x1;
    			b = y1;
    			c = x2;
    			d = y2;
    			 shape = new ShapePolygon(x1, y1, x2, y2, color);
    			shape.shape(g);
    			state = false;
    		} else {
    			x1 = c;
    			y1 = d;
    			x2 = e.getX();
    			y2 = e.getY();
    			c = x2;
    			d = y2;
    			 shape =  new ShapePolygon(x1, y1, x2, y2, color);
    			shape.shape(g);
    		}
    	} 
}
public void mouseClicked(MouseEvent e) {
	Graphics2D g2d = (Graphics2D) g;
	g2d.setStroke(new BasicStroke(tp.getstroke()));
	if (type.equals("006")) {
		NetJavaShape shape = new ShapePolygon(c, d, a, b, color);
		shape.shape(g);
		state = true;
	}

}
 (4)实现拖拽图形
Color color_temp = Color.white;
	if(type.equals("001")){
    		Graphics2D g2d = (Graphics2D) g;
    		g2d.setStroke(new BasicStroke(tp.getstroke()));
    		shape=new ShapeLine(x1,y1,x2,y2,color);
    		NetJavaShape shape_temp=new ShapeLine(x1,y1,x3,y3,color_temp);
    		shape_temp.shape(g);//清除上一次的图形
        	shape.shape(g);//画新的图形
        	//调用重绘方法
        	x3 = x2;
        	y3 = y2;
    	}
 (5)判断颜色来自颜色面板,还是颜色编辑器
//颜色的选择
        String command=DrawingListener.command;
    	if(command.equals("选择颜色")){
    		color = ccp.getcolor();
    		}
    	else if(command.equals("颜色面板")){
    		color = cp.getColor();  		
    	}
 (6)重绘中储存图形
//储存图形,计数器加1,已进行重绘
    	if(UI.count<UI.shapearray.length){
    		System.out.println("shape = "+shape);
			UI.shapearray[UI.count] = shape;
			UI.count++;
		}
 8、ToolEraser(粗了一点的白色铅笔)
9、ToolText(JOptionPane的使用)
public void shape(Graphics g) {
		g.setColor(color);
		String str=JOptionPane.showInputDialog("请输入文字:");
	    g.drawString(str, x1, y1);

	}
 10、DrawingBar
(1)二维数组的使用已实现菜单,菜单栏,菜单项
//调用的内部方法
	private void drawingbar() {
		//实例化菜单数组
		String [] arraymenu={"文件(F)","编辑(E)","图像(I)","颜色(C)","查看(V)","帮助(H)"};
		//实例化菜单项数组
		String[][] arraymenuitem = {
				{ "新建(N)", "打开(O)", "保存(S)", "另存为(A)", "打印预览(V)", "页面设置(U)",
						"打印(P)", "发送(E)", "设置为墙纸(平铺(B))", "设置为墙纸(居中)(K)",
						"退出(X)" },
				{ "撤销(U)", "重复(R)", "剪切(T)", "复制(C)", "粘贴(P)", "清除选定内容(L)",
						"全选(A)", "复制到(O)", "粘贴来源(F)" },
				{ "工具箱(T)", "颜料盒(C)", "状态栏(S)", "文字工具栏(E)", "缩放(Z)", "查看位图(V)" },
				{ "翻转/旋转(F)", "拉伸/扭曲(S)", "反色(I)", "属性(A)", "清除图像(C)",
				"不透明处理(D)" }, 
				{ "编辑颜色(E)" },
				{ "帮助主题(H)", "关于画图(A)" } 
				};
		//利用循环实现菜单栏(注意嵌套循环结构的使用)
		for(int i=0;i<arraymenu.length;i++){
			Menu menu=new Menu(arraymenu[i]);
			for(int j=0;j<arraymenuitem[i].length;j++){
				MenuItem menuitem=new MenuItem(arraymenuitem[i][j]);
				menu.add(menuitem);
			}
			this.add(menu);
		}
		
	}
	
 
  • 大小: 62.3 KB
  • 大小: 22.2 KB
分享到:
评论

相关推荐

    java学习小总结——画图板制作(附代码)

    在Java学习过程中,创建一个简单的画图板是一个经典的练习项目,它可以帮助我们深入理解图形用户界面(GUI)的构建和事件处理机制。本篇小结将聚焦于如何使用Java实现一个基本的画图板,同时提供相关的源码分析。 1...

    C#的简单画图板源码

    总结来说,这个C#的简单画图板源码涉及了C#的基础语法、Windows Forms开发、图形绘制、事件处理、颜色选择等核心概念。对于初学者来说,这是一个很好的实践项目,能帮助他们深入理解和掌握这些关键知识点。通过分析...

    画图板,window画图板

    总结,Windows画图板以其简单易用和功能丰富的特点,成为了日常生活中进行动态画图的得力助手。无论是儿童学习绘画,还是成年人进行快速草图设计,它都能提供一个便捷的平台。通过对画图板的深入理解和熟练运用,...

    画图板总结

    综上所述,画图板虽然看似简单,但其背后涉及到的技术和设计思路却相当丰富,包括事件处理、用户交互、图形渲染、数据结构、文件操作和网络通信等多个方面。无论是学习编程基础还是深入研究前端技术,理解并实现一个...

    简单画图板代码

    总结,"简单画图板代码"项目展示了如何利用C++的纯虚函数和继承特性来构建一个可扩展的图形绘制系统。纯虚函数提供了接口规范,而继承则实现了代码的复用和不同形状的分类。这种设计模式在软件开发中非常常见,尤其...

    openGL画图板实现简单画图功能

    总结,这个基于C++和OpenGL的画图板项目是一个很好的实践,它涵盖了OpenGL的基本概念、窗口管理、事件处理以及简单的图形绘制。通过学习和实现这样的项目,开发者可以深入理解OpenGL的工作流程,并为更复杂的3D图形...

    QTcreator写画图板

    画图板是一个简单的绘图程序,允许用户在窗口中用鼠标或触摸屏进行绘画。虽然功能简单,但画图板涉及许多GUI编程的核心概念,例如事件处理、绘图技术、组件操作等。通过开发画图板项目,用户能够学习和巩固Qt框架中...

    学生制作的画图板

    总结来说,“学生制作的画图板”不仅仅是一个简单的绘图软件,它更是一个知识共享和技术合作的平台。它通过提供一个简单易用的画图环境,帮助学生更好地完成作业,激发他们的创造力。同时,它也鼓励学生们在技术领域...

    画图板的实现

    在信息技术领域,创建一个简单的画图板是许多初学者和开发者经常接触的任务。这个过程涉及到图形用户界面(GUI)的设计和编程,通常使用Java这样的面向对象语言。在这个主题中,我们将深入探讨如何实现一个基本的...

    virtual c++6.o mfc简易画图板

    本项目“virtual c++6.0 mfc简易画图板”正是基于VC++ 6.0的MFC库,实现了类似Windows自带画图板的功能,让用户能够进行简单的图形绘制,如直线、圆、矩形和椭圆,并且可以调整线条的颜色和类型。 一、MFC库介绍 ...

    画图板代码(一)

    总结来说,这个"画图板代码"项目涵盖了事件处理、图形绘制、图形状态管理和用户交互设计等多个核心编程概念,是学习和实践GUI编程的一个良好起点。通过深入研究和实践,开发者可以进一步提升在图形用户界面开发领域...

    一个强大的画图板(一)

    总结起来,一个强大的画图板不仅是一个简单的绘图工具,更是创意表达、协同工作和知识传递的重要平台。它在技术博客中扮演着不可或缺的角色,帮助作者以更直观的方式传达复杂的技术概念。无论你是设计师、教师、学生...

    用c#写的画图板

    在本文中,我们将深入探讨如何使用C#编程语言创建一个基本的画图板应用程序。C#是一种面向对象的、类型安全的...通过不断迭代和添加更多功能,如保存和加载图片,这个简单的画图板可以成为一个功能丰富的艺术创作工具。

    java画图板系统

    总结来说,这个【Java画图板系统】项目展示了如何使用Java GUI技术来创建一个交互式的绘图应用。通过Eclipse IDE,开发者可以方便地管理、编译和调试代码,确保在不同JDK版本下的一致性。对于学习和理解Java GUI编程...

    画图板课程设计

    本项目,即“画图板课程设计”,是基于C++语言和MFC框架实现的一个简单画图工具。它为初学者提供了宝贵的实践机会,通过这个项目,可以深入理解MFC的工作机制,同时掌握图形用户界面(GUI)的创建和交互。 首先,...

    行业文档-设计装置-教学用画图板.zip

    《教学用画图板》行业文档...总结,教学用画图板是教育现代化的重要组成部分,它以创新的方式增强了教学互动,提升了教学质量。随着技术的发展,未来教学用画图板的功能将更加完善,有望在更多教育场景中发挥重要作用。

    用EVC4.0开发的画图板

    本篇文章将详细探讨如何使用EVC4.0来开发一个简单的画图板程序,该程序具备打开和保存BMP图像文件的能力。 首先,让我们了解EVC4.0。EVC4.0是针对Microsoft Windows CE和Pocket PC等嵌入式平台的C++编译器和开发...

    画图板小程序

    "画图板小程序"就是一个典型的示例,它使用Microsoft Foundation Classes (MFC)库来实现一个简单的绘图应用程序。MFC是微软提供的一套C++类库,用于简化Windows应用程序的开发,它封装了Windows API,提供了面向对象...

    画图板_指导手册

    ### IT知识点:编程入门之画图板开发指南 在IT领域,尤其是软件开发与编程教育中,画图板项目的开发不仅是新手程序员学习图形用户界面(GUI)设计与交互性编程的一个重要实践,也是深入理解Windows消息处理机制、MFC...

    强大的vb画图板源码下载

    【标题】:“强大的vb画图板源码下载” 在编程领域,Visual Basic(VB)是一种常用的编程语言,尤其适合初学者和快速开发简单应用程序。这个“强大的vb画图板源码”显然提供了一个用于图形绘制的用户界面组件,使得...

Global site tag (gtag.js) - Google Analytics