`
chenzhaomin
  • 浏览: 10224 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

桌面画图板的实现

    博客分类:
  • Java
阅读更多

实例:桌面画板画板

 

在实现桌面画板有两个问题:

第一:如何实现在桌面上画图

第二:如何实现重绘

 

首先说明第一种,其实也很简单,在桌面上画图并不是真的就直接在桌面上画,而是先给桌面截个图,然后在上面画

给人产生一种假象,感觉好像在桌面一样,其实已经是在java的窗体中了

如何给桌面截图呢?先是用Robot类拿到一个桌面然后储存在BufferImage中:及BufferImage image = robot.robot.createScreenCapture(screenRect);(实例看代码)

 

然后就是重绘的问题了,在本例中,我打算实现类似铅笔的效果,就是自由划线

如果不写重绘方法,我想大家都应该知道,只要以缩小然后放大就没了。

我们知道,要想重绘就必须得储存每个圆的位置与大小(这里已连续画圆来实现划线),大家可能第一反应就是用数组,可是用数组是不对的,也不能说不对,至少效果时能出来,但是太占内存了,而且我们不知道会有多少个圆,所以在这里我使用Arraylist。

一开始我以为这个列队几个类都要用,干脆声明成静态变量来的方便,可是问题就来了,只要是声明成静态的,那么就会报错,越界。

后来熊哥告诉我不能声明成静态的,我去网上查了一下,我发现非静态的成员变量,存储在内存堆(heap)区,静态的成员变量存储在内存栈区.

那么也就是说,静态变量不能像非静态那样不断地向系统要内存,所以就会溢出了。

import java.awt.AWTException;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.KeyEventPostProcessor;
import java.awt.KeyboardFocusManager;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * 桌面画图程序
 * 
 * @author ChenZhaoMin
 * 
 */
public class DrawBoard extends JFrame {

	private Robot robot = null;
	private Toolkit tool = Toolkit.getDefaultToolkit();
	private Rectangle screenRect = null;
	private BufferedImage image = null;
	private Graphics g;
	private DrawListener dl;
	private ArrayList<Integer> listX = new ArrayList<Integer>();
	private ArrayList<Integer> listY = new ArrayList<Integer>();

	/**
	 * @param args
	 * @throws AWTException
	 */
	public static void main(String[] args) throws AWTException {
		DrawBoard db = new DrawBoard();
		db.initUI();
	}

	public void initUI() throws AWTException {
		// 新建机器人
		robot = new Robot();//这里会抛异常,我偷个懒,就不处理了
		// 新建截屏区域
		int width = tool.getScreenSize().width;
		int height = tool.getScreenSize().height;
		screenRect = new Rectangle(0, 0, width, height);
		// 创建截图固定区域的图像缓冲
		image = robot.createScreenCapture(screenRect);

		// 初始化窗体
		this.setSize(tool.getScreenSize().width, tool.getScreenSize().height);
		this.setUndecorated(true);
		this.setLocationRelativeTo(null);
		// 添加背景
		ImageIcon icon = new ImageIcon(image);
		JLabel jl = new JLabel(icon);
		jl.setBounds(0, 0, this.getWidth(), this.getHeight());
		this.getLayeredPane().add(jl, new Integer(Integer.MIN_VALUE));
		JPanel jp = (JPanel) this.getContentPane();
		jp.setOpaque(false);
		this.setVisible(true);

		g = this.getGraphics();
		dl = new DrawListener(g, this, listX, listY);
		this.addMouseMotionListener(dl);
		this.addMouseListener(dl);
		
		//实现按下esc退出程序
		KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
		manager.addKeyEventPostProcessor(new KeyEventPostProcessor() {
		public boolean postProcessKeyEvent(KeyEvent e) {
		if (KeyEvent.VK_ESCAPE == e.getKeyCode()) {
		System.exit(0);
		}
		return true;
		}
		});
	}

	public void paint(Graphics g) {
		super.paint(g);
		// g.drawImage(image, 0, 0, null);注意一点的是如果是画出来的画那么在使用弹出菜单时会出问题
		// 实现清除命令
			// 重绘圆
			for (int i = 0; i < listX.size(); i++) {
				g.fillOval(listX.get(i), listY.get(i), Config.MIDDLESTROKE,
						Config.MIDDLESTROKE);
			}

	}
}


package cn.czm0724;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;

/**
 * 画图监听器
 * 
 * @author ChenZhaoMin
 * 
 */
public class DrawListener extends MouseAdapter {
	private Graphics g;
	private DrawBoard bd;
	private JPopupMenu jpop = new JPopupMenu();
	private ArrayList<Integer> listX;
	private ArrayList<Integer> listY;
	private int stroke = Config.MIDDLESTROKE;

	public DrawListener(final Graphics g, final DrawBoard bd,
			ArrayList<Integer> listX, ArrayList<Integer> listY) {
		this.g = g;
		this.bd = bd;
		this.listX = listX;
		this.listY = listY;
		// 实现清除菜单
		JMenuItem jmi1 = new JMenuItem("清除");
		jmi1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				clear();
				bd.repaint();

			}
		});
		jpop.insert(jmi1, 0);
		// 实现改变笔触大小菜单
		JMenu jmi2 = new JMenu("大小");
		JMenuItem small = new JMenuItem("小");
		small.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				stroke = Config.SMALLSTROKE;
			}
		});
		jmi2.add(small);

		JMenuItem middle = new JMenuItem("中");
		middle.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				stroke = Config.MIDDLESTROKE;
			}
		});
		jmi2.add(middle);

		JMenuItem large = new JMenuItem("大");
		large.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				stroke = Config.LARGESTROKE;
			}
		});
		jmi2.add(large);
		jpop.insert(jmi2, 1);
		// 实现退出菜单
		JMenuItem jmi3 = new JMenuItem("退出");
		jmi3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		jpop.insert(jmi3, 2);
	}

	// 实现事变拖拽画圆的方法
	public void mouseDragged(MouseEvent e) {
		int x = e.getX();
		int y = e.getY();
		g.fillOval(x, y, stroke, stroke);
		listX.add(x);
		listY.add(y);

	}

	// 监听鼠标右键
	public void mouseClicked(MouseEvent e) {
		// 监听鼠标右键
		if (e.isMetaDown()) {
			jpop.show(bd, e.getX(), e.getY());
		}
	}

	public void clear() {
		listX.removeAll(listX);
		listY.removeAll(listY);
	}

	public int getStroke() {
		return stroke;
	}
}

 


 

 

 
 

 


 

  • 大小: 64.3 KB
  • 大小: 70.1 KB
  • 大小: 71.7 KB
分享到:
评论
1 楼 felixour 2013-08-09  
必须顶一个啊~

相关推荐

    java 画图板 windows画图板简单实现

    在Java编程语言中,实现一个简单的Windows画图板是一个经典的练习,它可以帮助初学者更好地理解图形用户界面(GUI)的设计以及事件处理机制。这个项目通常会涉及到Java的Swing库,这是一个用于创建桌面应用程序的GUI...

    画图板的实现

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

    基于qt实现的画图板

    这个"基于qt实现的画图板"项目提供了一个基础的图形用户界面(GUI)应用,让用户能够进行基本的绘画操作,比如选择画笔、填充颜色、打开和保存图像。以下是关于这个项目的一些关键知识点和相关技术的详细解释: 1. ...

    QT画图板详例

    QT画图板的实现通常涉及到以下关键知识点: 1. **QGraphicsView和QGraphicsScene**:这是Qt提供的一套用于2D图形渲染的高级组件。QGraphicsView作为视图窗口,负责显示QGraphicsScene中的内容。QGraphicsScene是...

    java画图板java画图板

    Java画图板是一种基于Java语言实现的图形用户界面(GUI)工具,允许用户在屏幕上绘制图形和图像。在Java中,我们通常使用Java AWT(Abstract Window Toolkit)或Swing库来创建这样的画图应用程序。这两个库都是Java ...

    qt画图板的实现

    本项目以“qt画图板的实现”为主题,是基于Qt库创建的一个简单但功能丰富的图形绘制工具,非常适合C++初学者进行课程设计或者作为实践项目。 首先,我们要理解Qt中的主要组件——`QWidget`和`QPainter`。`QWidget`...

    Java画图板应用

    为了提供类似Windows画图板的橡皮擦功能,Java画图板应用可能实现了两种模式:一种是使用特定的橡皮擦工具,另一种是将画笔颜色设置为背景色,从而达到擦除的效果。此外,添加形状绘制功能,如矩形、圆形和多边形,...

    java swing 画图板

    在这个画图板中,开发者会利用Graphics2D对象的方法,如`drawLine()`, `drawRect()`, `fillOval()`等,来实现画线、画矩形和圆形等操作。 4. **事件监听器(Event Listeners)**:为了响应用户的鼠标点击和移动,...

    仿XP画图板

    【描述】"仿XP画图板"实现了画图板的多数核心功能,包括但不限于选择不同的画笔、颜色、线型,以及橡皮擦、填充、复制、粘贴、撤销、重做等操作。它的界面设计与XP原版画图板极其相似,这不仅提供了用户熟悉的操作...

    C# 画图板 源码

    这个“C# 画图板 源码”项目,适用于.NET Framework 1.1和2.0,展示了如何利用C#语言实现一个基本的绘画应用程序。以下是该项目中涉及的主要知识点: 1. **Windows Forms**: 这个源码是基于Windows Forms框架构建的...

    C#画图板-直线、曲线、矩形

    在C#编程环境中,开发一个画图板应用是一项常见的任务,尤其对于教学、设计或创建图形用户界面(GUI)的应用程序。在这个项目中,我们关注的是实现基础的绘图功能,包括绘制直线、曲线和矩形,并允许用户选择线条的...

    C#画图板程序

    C#画图板程序是一种基于Microsoft .NET Framework的桌面应用程序,它允许用户通过鼠标或触控设备进行图形绘制。这个程序通常由C#编程语言编写,利用Windows Forms或WPF(Windows Presentation Foundation)框架来...

    Java简易画图板

    在这个简易画图板项目中,Java用于实现图形用户界面(GUI)和图形绘制逻辑。 2. **图形用户界面(GUI)**:Java提供了JavaFX和Swing两个主要的库来创建GUI应用。本项目可能使用了Swing,因为它是一个相对成熟的库,...

    JavaFx开发Windows画图板工具

    在画图板工具中,用户可以选择不同颜色和线宽的笔触,填充颜色,以及橡皮擦功能,这些都需要通过GraphicsContext的不同方法实现。 事件处理是JavaFX中另一个关键部分。我们要监听鼠标事件,如mousedown、mousemove...

    MFC简单画图板

    总之,"MFC简单画图板"是一个基础的图形界面应用实例,它展示了MFC在GUI编程中的应用,对于想要涉足Windows桌面应用程序开发的初学者而言,这是一个不错的实践项目。通过学习和扩展这个应用,开发者不仅可以提升MFC...

    基于MFC的画图板的实现

    在“基于MFC的画图板实现”项目中,主要涉及以下几个关键知识点: 1. **CWinApp**:这是每个MFC应用程序的入口点,负责初始化、运行和结束应用程序。在这个项目中,我们需要创建一个继承自CWinApp的类,用于设置...

    一个Java实现的画图板程序

    在本项目中,“一个Java实现的画图板程序”是一个基于Java开发的图形用户界面应用,它允许用户进行基本的绘图操作,如绘制线条、形状、填充颜色等。这个程序通常会利用Java的AWT(Abstract Window Toolkit)或Swing...

    VC做的画图板程序用VC的MFC做的一个画图板程序

    【VC做的画图板程序】是一个基于Microsoft Visual C++(简称VC)的MFC(Microsoft Foundation Classes)框架开发的应用程序。MFC是微软提供的一套C++类库,用于简化Windows应用程序的开发,它封装了Windows API,...

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

    《VC++ 6.0 MFC简易画图板:实现与技术详解》 在软件开发领域,Microsoft Visual C++ 6.0(简称VC++ 6.0)是一款经典的集成开发环境,它提供了强大的MFC(Microsoft Foundation Classes)库,方便开发者构建Windows...

    画图板(类似windows)

    C#是一种面向对象的编程语言,由微软开发,常用于构建桌面应用程序,如本案例中的画图板。 【描述】:“和同学讨了了研究了三天,基本功能都能有,而且还能填充不规则图形颜色,直接修改图片,保存,希望能对大家有...

Global site tag (gtag.js) - Google Analytics