`
Only_one.zy
  • 浏览: 5648 次
  • 性别: 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小程序 模仿Win系统画板)

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个类似于Windows操作系统中的简易画板程序。这个Java小程序将提供基本的绘图功能,使用户能够通过鼠标或触控设备进行绘画创作。 首先,我们需要理解Java GUI...

    java画板大作业

    Java画板大作业通常是指在Java编程环境下,利用Java AWT(Abstract Window Toolkit)或Swing库创建一个图形用户界面(GUI),实现一个简单的画板应用程序。这个项目可以帮助初学者理解面向对象编程、事件处理、图形...

    java 实现 画板程序

    【Java 实现画板程序详解】 Java编程语言可以用来创建各种类型的应用程序,其中包括图形用户界面(GUI)程序。在本例中,我们将探讨如何利用Java实现一个简单的画板程序,该程序允许用户绘制直线、长方形、椭圆和...

    num_01.rar_java画板的实现_thoucw6

    Java画板的实现是Java图形用户界面(GUI)编程中的一个重要方面。在Java中,我们通常使用Java的AWT(Abstract Window Toolkit)或Swing库来创建和自定义画板,以便实现各种图形绘制功能。这些功能包括但不限于绘制...

    java画板 比较简单的画板

    Java画板是一个基础的图形用户界面(GUI)应用,它允许用户通过编程在屏幕上绘制图形。这个主题非常适合Java初学者,因为它涉及到基本的GUI编程概念,如事件处理、图形绘制和用户交互。以下是对这个话题的详细讲解:...

    java画板代码 可以画图形

    本篇文章将深入探讨如何使用Java实现画板功能,并通过代码示例来展示如何画出简单的几何图形。 首先,我们需要了解`java.awt.Graphics`类,它是Java AWT的核心绘图类。这个类提供了一系列的方法,如`drawLine()`, `...

    画画_java画板_

    在Java中,我们可以利用Java的AWT(Abstract Window Toolkit)或Swing库来创建画板,实现图形的绘制。 首先,让我们详细了解一下Java AWT和Swing库。AWT是Java最早提供的图形用户界面(GUI)工具包,它提供了基本的...

    Java 画板设计分析与实现[源码][附图]

    本主题将深入探讨Java 画板的设计、分析及其实现,同时结合源码解析,以帮助你更好地理解和应用这一技术。 首先,Java中的画板组件(java.awt.Canvas)是AWT(Abstract Window Toolkit)库的一部分,它提供了基本的...

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

    Java画板是一个强大的图形用户界面(GUI)工具,主要用于创建可视化应用或进行图形设计。它基于Java编程语言,利用Java的Swing库或JavaFX库来实现。在本例中,"DrawBox"可能是一个自定义开发的画板程序,为用户提供...

    JAVA画板(改进版)

    【JAVA画板(改进版)】是一个专为初学者设计的JAVA程序,它在原有的基础上进行了功能增强,使得用户能够体验到更为丰富的图形绘制和编辑功能。这个项目旨在帮助学习者更好地理解和应用JAVA编程语言,特别是图形用户...

    java画板程序

    Java画板程序是一种基于Java编程语言开发的图形用户界面(GUI)应用,它允许用户通过鼠标或触控设备在屏幕上绘制图形。这个程序通常会利用Java的AWT(Abstract Window Toolkit)或Swing库来创建图形组件,如画布、...

    JAVA画板中的保存程序

    在Java编程环境中,我们可以利用内置的图形用户界面(GUI)组件和类来创建一个画板应用,让用户进行绘图操作。这个"JAVA画板中的保存程序"是一个具有特色的项目,它不仅提供了画图功能,还能将用户的绘图保存为文件...

    java简单画板程序

    Java简单画板程序是一个基于Java编程语言开发的图形用户界面应用,主要目的是提供一个基础的绘图环境。这个程序允许用户在屏幕上绘制各种图形和线条,实现简单的绘画功能。通过这个程序,我们可以学习到以下几个Java...

    JAVA实现画板

    【JAVA实现画板】项目是一个基于JAVA编程语言的图形用户界面(GUI)应用程序,它允许用户在屏幕上绘制各种形状和线条,类似于常见的电子画板软件。这个项目可能使用了Java的Swing或JavaFX库来构建GUI,这两个库提供...

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

    这个特定的项目,"java实现画板的基本功能程序",利用了Java的轻量级组件(Lightweight Components)来构建这样的应用。下面将详细讨论Java轻量级组件以及如何用它们来实现画板的基本功能。 1. Java轻量级组件: ...

    java编写的画板

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

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

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

    java课程设计大作业<画板图像编辑器>

    本项目名为“画板图像编辑器”,是一个基于Java实现的简易图像处理工具,旨在帮助初学者熟悉Java编程并实践GUI(图形用户界面)应用的开发。这个图像编辑器虽然功能相对简单,但包含了基本的图像操作,如截图和保存...

    Java实现简单的画板

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个简单的画板应用程序。这个程序允许用户在图形用户界面上绘制各种基本形状,如线条、矩形、圆形等,从而提供了一个基本的绘画环境。 首先,我们需要引入Java...

Global site tag (gtag.js) - Google Analytics