`
Only_one.zy
  • 浏览: 5431 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java 画板初步实现

阅读更多

       实际上,在一个程序中,参数的传递是无处不在的。参数传递,分为值传递和引用传递。值传递,顾名思义,就是传递的是值,只有其值发生改变。而引用传递则是地址的传递,参数中存储的实际上是一个地址。那么引用传递就可实现类的对象的传递。总而言之,值传递适用于8大基本数据类型和String类型。而引用传递则适用于对象类型。

       接下来,就说说画板的初步实现。对于一个画板的创建,显然分为两部分,界面和事件监听机制。显然,界面的创建,需要先创建一个窗体,然后将窗体分为两部分(使用默认布局,边框布局即可)。一部分放置按钮,一部分实现画板。

        很显然界面的实现还是相当简单的,当界面实现以后,就是事件监听机制的实现了。事件监听机制,分为三部分,一为事件源,二为事件监听器方法,三为事件处理类。显然对于按钮是使用ActionListener的动作监听方法监听,而画板则是使用MouseListener和MouseMotionListener两种鼠标监听方法。通过创建一个按钮的事件处理类来实现按钮的区别并将其按钮的命令值传给主函数所在类的属性。然后创建一个画板的事件处理类继承MouseListener和MouseMotionListener两种接口,并通过主函数所在的类的属性的引用传递,来区分当前是哪个按钮,然后对鼠标进行不同的监听处理。最后一个问题就是,如何来将画的图形显示在面板上呢?那么我们就要用到Graphics类了。这是一个画布类,其不能直接的创建一个画布,但是可以通过面板来获取画布,形式大概如:Graphics g=panelC.getGraphics(); 这样就能获取一个面板上的画布了。然后将这个画布传入鼠标事件处理类里就行了。我们需要注意的就是在面板上创建绘制图形的画布必须在设置JFrame(窗体)可见之后。

          作为一个画板最基本的就是直线、铅笔、橡皮,另外的一些就是矩形、椭圆、圆角矩形、喷漆、刷子、多边形、以及颜色的选择了。而画布中本身拥有的方法有画直线、矩形、椭圆、圆角矩形,那么对于这些我们很容易就可以实现了,那么对于颜色的选择是如何实现的呢?实际上,JAVA本身就自带了一个颜色选择器,我们只需调用即可,很显然颜色选择器所选择的颜色也是用主函数所在的类中的一个属性来存储,然后传入事件处理类中。颜色处理器的实现如:JColorChooser.showDialog(null,"colorchooser",Color.black),这个语句将会实现跳出一个新的颜色选择器界面,并且当选择完颜色后,将会返回一个Color的对象。铅笔,很简单不断画直线就能轻松实现(跟随鼠标拖动而变化)。刷子,就是铅笔的加粗版,对于这个的实现只需基于铅笔,将所画的线多几条便可以了。橡皮?不就是白色的刷子么- -。喷漆的话,可以使用一个随机数来实现画点,画点的话- -不就是起始和终止位置相同的直线么。而多边形,只需使用三个坐标就行,一组记录最原始的位置,另两组记录当前和上一次的位置即可。这样,一个初步的画板就实现了。

         本来的话,是想将画板的跟踪功能实现的(就是鼠标在拖动过程中,会将你在此松开的结果预先显示)。最初想法很天真 - -,就是监视鼠标拖动过程中不断的删除上一步所画结果(将上一步画的图形再用白色绘制一遍),然后画出本次预计结果,直到鼠标松开正式画出结果。但最后调试发现这样会将原本所画的东西清除掉,这样就坑爹的失败了。下面就是我的基本画板的运行图和代码:

 

 

 

package Doubipanel;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DoubiPanelMain {

	private Color color=Color.BLACK;
	public String str="Line";
	public static void main(String[] args) {
		DoubiPanelMain dp=new DoubiPanelMain();
		dp.initUi();
	}
	//private PMouseLisener mouselisener;
	//初始化窗口方法
	public JFrame  initUi(){
		JFrame frame=new JFrame("逗 比 画 板");
		//创建动作监听类对象
		BtActionListener btal=new BtActionListener(this);
		//设置窗口大小
		frame.setSize(690,500);
		//设置窗口大小不可改变
		frame.setResizable(false);
		//设置窗体位置居中
		frame.setLocationRelativeTo(null);;
		//设置关闭
		frame.setDefaultCloseOperation(3);
		//创建事件监听类对象
		
		//调用添加创建北边面板的方法
		creatPanelN(frame,btal);
		//调用添加创建中间面板的方法
		JPanel panelC= creatPanelC(frame);
		//设置窗口可见
		frame.setVisible(true);
		//创建绘制图形的对象
		Graphics g=panelC.getGraphics();
		//创建鼠标事件监听类对象
		PMouseLisener mouselisener=new PMouseLisener(g,this);
		panelC.addMouseListener(mouselisener);
		panelC.addMouseMotionListener(mouselisener);
		
		
		
		return frame;
	}
	
	//获得actionlistener的名称的方法
	public String getStr(){
		
		return str;
	}
	public Color getColor(){
		
		return color;
	}
	public void setColor(Color color){
		
		this.color=color;
	}
	
	//添加北画板的方法
	public JPanel creatPanelN(JFrame frame,BtActionListener btal){
		JPanel panelN=new JPanel();
		panelN.setBackground(new Color(1,250,250));
		panelN.setPreferredSize(new Dimension(0,75));
		String [] bt1= {"Line", "Rect", "Oval", "RoundRect", "Polygon","pencil","brush","eraser","color","spraygun"};
		for (int i=0;i<10;i++){
			JButton bt=new JButton(bt1[i]);
			bt.setActionCommand(bt1[i]);
			bt.addActionListener(btal);
		
			panelN.add(bt);
		}
		
		//将面板添加到窗口上
		frame.add(panelN,BorderLayout.NORTH);
		return panelN;
	}
	//中间面板的方法
	public JPanel creatPanelC(JFrame frame){
		JPanel panelC=new JPanel();
		panelC.setBackground(Color.white);
		//panelC.addMouseListener(mouselisener);
		frame.add(panelC,BorderLayout.CENTER);
		return panelC;
	}
	
}



package Doubipanel;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JColorChooser;

public class BtActionListener implements ActionListener{

	//构造方法
	String str;
	DoubiPanelMain dp;
	public BtActionListener(DoubiPanelMain dp){
		this.dp=dp;
	}
	
	public void actionPerformed(ActionEvent e) {
	/*	if (e.getActionCommand().equals("Line")){
			
		}
		else if(e.getActionCommand().equals("Rect")){
			
		}
		else if(e.getActionCommand().equals("RoundRect")){
			
		}
		else if(e.getActionCommand().equals("Polygon")){
			
		}*/
	    dp.str=e.getActionCommand();
	    if (dp.str.equals("color")) {
	    	dp.setColor(JColorChooser.showDialog(null,"colorchooser",Color.black));
	    }
	}

}




package Doubipanel;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Random;

import javax.swing.event.MouseInputListener;

public class PMouseLisener implements MouseInputListener,MouseMotionListener{
    
	private int  x,y,x1,x2,y1,y2,x0,y0;
	//private int x[],y[];
	private int i=0,j=0;
	private Graphics g;
    private DoubiPanelMain dp;
	//构造方法
	public PMouseLisener (Graphics g,DoubiPanelMain dp){
		this.g=g;
		this.dp=dp;
	}
	

	public void mouseEntered(MouseEvent arg0) {
		//System.out.println(x1+" "+y1);
		
	}
   
	
	//记录鼠标按下
	public void mousePressed(MouseEvent e) {
		g.setColor(dp.getColor());
		if(dp.str.equals("Polygon") ){
			if(i==0){
				System.out.println("坑爹");
				i=1;
				x=x0=x1=e.getX();
				y=y0=y1=e.getY();
				System.out.println(x1+" "+y1);
			}
		}
		else {
		x1=e.getX();
		y1=e.getY();
		System.out.println(x1+" "+y1);
		}
	}
	
	
	public void mouseDragged(MouseEvent e) {
		if(dp.str.equals("pencil")){
			x2=e.getX();
			y2=e.getY();
			g.drawLine(x1, y1, x2, y2);
			y1=y2;x1=x2;
		}
		else if(dp.str.equals("spraygun")){
			x2=e.getX();
			y2=e.getY();
			Random random=new Random();
			for (int l=1;l<=30;l++){
				int j=random.nextInt(11)-5;
				int i=random.nextInt(11)-5;
				g.drawLine(x2+i, y2+j, x2+i, y2+j);
			}
		}
		else if(dp.str.equals("brush")){
			x2=e.getX();
			y2=e.getY();
			for(i=-2;i<=2;i++){
				g.drawLine(x1, y1+i, x2, y2+i);
			}
			for(i=-2;i<=2;i++){
				g.drawLine(x1+i, y1, x2+i, y2);
			}
			x1=x2;y1=y2;
			
		}
		else if (dp.str.equals("eraser")){
			g.setColor(Color.white);
			x2=e.getX();
			y2=e.getY();
			for(i=-5;i<=5;i++){
				g.drawLine(x1, y1+i, x2, y2+i);
			}
			for(i=-5;i<=5;i++){
				g.drawLine(x1+i, y1, x2+i, y2);
			}
			x1=x2;y1=y2;
		}
		else {
			
			
			//此段代码原本想实现结果预显功能的- -但失败了
	/*		x2=e.getX();
			y2=e.getY();
			if (dp.str.equals("Line")){
				//if((x!=x2 || y!= y2) ){
					g.setColor(Color.WHITE);
					g.drawLine(x1,y1,x,y);
					g.setColor(dp.getColor());
				
				g.drawLine(x1,y1,x2,y2);
				x=x2;y=y2;
			}
			else if(dp.str.equals("Rect")){
				if((x!=x2 || y!= y2) ){
					g.setColor(Color.WHITE);
					g.drawRect(x1>=x? x:x1, y1>=y?y:y1, Math.abs(x1-x), Math.abs(y1-y));
					g.setColor(dp.getColor());
				}
				g.drawRect(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2));
				x=x2;y=y2;
			}
			else if(dp.str.equals("Oval")){
				g.setColor(Color.WHITE);
				g.drawOval(x1>=x? x:x1, y1>=y?y:y1, Math.abs(x1-x), Math.abs(y1-y));
				g.setColor(dp.getColor());
				g.drawOval(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2));
				x=x2;y=y2;
			}
			else if(dp.str.equals("RoundRect")){
				g.setColor(Color.WHITE);
				g.drawRoundRect(x1>=x? x:x1, y1>=y?y:y1, Math.abs(x1-x), Math.abs(y1-y),25,25);
				g.setColor(dp.getColor());
				g.drawRoundRect(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2),25,25);
				x=x2;y=y2;
			}
			*/
		}
	}
	
	
   //记录鼠标释放
	public void mouseReleased(MouseEvent e) {
		x2=e.getX();
		y2=e.getY();
		
		if(dp.str.equals("Polygon")){
			//if(i==1&&j==0){
				//j++;
				//x[j+1]=e.getX();
				//y[j+1]=e.getY();
				x2=e.getX();
				y2=e.getY();
				g.drawLine(x1, y1, x2, y2);
				if(x1==x2&& y1==y2)  q++;
				x1=x2;y1=y2;
			//}
			
		}
		else {
			x2=e.getX();
			y2=e.getY();
		if (dp.str.equals("Line")){
			g.drawLine(x1, y1, x2, y2);
		}
		else if(dp.str.equals("Rect")){
				g.drawRect(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2));
		}
		else if(dp.str.equals("Oval")){
			g.drawOval(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2));
		}
		else if(dp.str.equals("RoundRect")){
			g.drawRoundRect(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2),25,25);
		}
		
		
	   }
	}

	private int q=0;

	@Override
	public void mouseClicked(MouseEvent e) {
		if(dp.str.equals("Polygon")){
			
			x2=e.getX();
			y2=e.getY();
			g.drawLine(x1, y1, x2, y2);
			if(q==2)
				{g.drawLine(x0,y0,x2,y2);q=0;i=0;}
			
		}
		
	}



	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseMoved(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}

 

  • 大小: 212.7 KB
分享到:
评论

相关推荐

    java画板代码 可以画图形

    java画板代码:代码功能可以实现在一个画板中画一些比较简单的几何图形。

    java画板 比较简单的画板

    java画板 比较简单的画板 ,初学者可以借鉴下!java画板 比较简单的画板 ,初学者可以借鉴下!java画板 比较简单的画板 ,初学者可以借鉴下!

    java 实现 画板程序

    一个实现简单画板功能的java程序,可以画直线,长方形,椭圆,曲线。

    java简单画板程序

    java画板,实现了基本的功能,压缩包内包含了draw.jar包,java文件,大家可以直接运行。当然本程序还有不少的不足之处,望大家能见量。

    JAVA实现小画板课程设计

    JAVA实现小画板课程设计 学习了《Java面向对象编程》的课程,为了更进一步的提高我们对Java的深入学习,进行了课程设计,我所选择课程设计是利用Java的GUI实现画图应用程度。其目的是通过本课程设计使我们能够较全面...

    Java实现画板(Java小程序 模仿Win系统画板)

    Java小程序——模仿Win系统画板 使用Java实现Windows操作系统的高仿小画板。

    java编写的画板

    这是一个用Java GUI编写的画板程序,自编代码,java课程设计 实现铅笔,橡皮,功能,可以画直线,矩形,圆等各种形状,可以保存读取所画图片,更改背景等。也有图片。可根据自己需求添加新功能,有一些功能也供大家...

    java画板程序支持文件打开,保存。

    java画板程序 源代码,自己写的作业,给大家共享一下了,^_^。代码共享,随意修改了。呵呵。支持文件的打开和保存操作,默认的文件格式为jdf,压缩包中firstDraw.jdf为我画的第一幅画,可以用来打开测试。。

    JAVA实现画板

    用JAVA实现的画板Project包,赶时间,保存图片略有瑕疵

    java画板大作业

    学Java是学校布置的大作业,适合刚学java编程这的学习,对学习很有帮助。

    画画_java画板_

    java画板,适合新手练习,更熟悉面对对象

    java画板源代码java画板源代码.doc

    java画板源代码java画板源代码

    JAVA画板论文设计

    不错的,看看吧!好好好好好,画板画板,画板画板

    java画板很好很强大,放心使用~!`

    很大的简易JAVA画板,很好很强大,大部 分的人都可以用,可以用来完成老师布置的作业哦,谢谢放心使用!~!~

    java实现画板的基本功能程序

    采用java中的轻量级组件实现了画板的基本功能

    Java实现简单的画板

    用Java实现的图形界面的简易画板程序,能够话出一般常见的形状

    java 网络绘画板

    这是一个基于java socket连接实现的简单GUI网络画图白板程序,项目文件中app package中的MultiServer.java是服务端监听程序的主程序;Client.java是客户端启动程序。运用面向对象程序设计思想,基于java的GUI、套接字...

    java画板程序

    java写的经典画板程序,内附代码,可供学习

    java写的画板

    1. 画板UI设计(总体布局) (1)创建窗体并设置相关属性; (2)给整个窗体添加一个中间容器用来覆盖整个窗体;... 根据Java多线程来实现弹泡泡功能;泡泡的位置颜色随机出现,并且做到碰到边框会变色;

    JAVA画板(改进版)

    本画板是在前有花瓣的基础上添加了许多功能后形成的一个功能比较强大的而且代码简单的JAVA程序,适合初学者使用。

Global site tag (gtag.js) - Google Analytics