实例:桌面画板画板
在实现桌面画板有两个问题:
第一:如何实现在桌面上画图
第二:如何实现重绘
首先说明第一种,其实也很简单,在桌面上画图并不是真的就直接在桌面上画,而是先给桌面截个图,然后在上面画
给人产生一种假象,感觉好像在桌面一样,其实已经是在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; } }
相关推荐
在Java编程语言中,实现一个简单的Windows画图板是一个经典的练习,它可以帮助初学者更好地理解图形用户界面(GUI)的设计以及事件处理机制。这个项目通常会涉及到Java的Swing库,这是一个用于创建桌面应用程序的GUI...
《画图板的实现》 在信息技术领域,创建一个简单的画图板是许多初学者和开发者经常接触的任务。这个过程涉及到图形用户界面(GUI)的设计和编程,通常使用Java这样的面向对象语言。在这个主题中,我们将深入探讨...
这个"基于qt实现的画图板"项目提供了一个基础的图形用户界面(GUI)应用,让用户能够进行基本的绘画操作,比如选择画笔、填充颜色、打开和保存图像。以下是关于这个项目的一些关键知识点和相关技术的详细解释: 1. ...
QT画图板的实现通常涉及到以下关键知识点: 1. **QGraphicsView和QGraphicsScene**:这是Qt提供的一套用于2D图形渲染的高级组件。QGraphicsView作为视图窗口,负责显示QGraphicsScene中的内容。QGraphicsScene是...
本项目以“qt画图板的实现”为主题,是基于Qt库创建的一个简单但功能丰富的图形绘制工具,非常适合C++初学者进行课程设计或者作为实践项目。 首先,我们要理解Qt中的主要组件——`QWidget`和`QPainter`。`QWidget`...
为了提供类似Windows画图板的橡皮擦功能,Java画图板应用可能实现了两种模式:一种是使用特定的橡皮擦工具,另一种是将画笔颜色设置为背景色,从而达到擦除的效果。此外,添加形状绘制功能,如矩形、圆形和多边形,...
在这个画图板中,开发者会利用Graphics2D对象的方法,如`drawLine()`, `drawRect()`, `fillOval()`等,来实现画线、画矩形和圆形等操作。 4. **事件监听器(Event Listeners)**:为了响应用户的鼠标点击和移动,...
【描述】"仿XP画图板"实现了画图板的多数核心功能,包括但不限于选择不同的画笔、颜色、线型,以及橡皮擦、填充、复制、粘贴、撤销、重做等操作。它的界面设计与XP原版画图板极其相似,这不仅提供了用户熟悉的操作...
这个“C# 画图板 源码”项目,适用于.NET Framework 1.1和2.0,展示了如何利用C#语言实现一个基本的绘画应用程序。以下是该项目中涉及的主要知识点: 1. **Windows Forms**: 这个源码是基于Windows Forms框架构建的...
在C#编程环境中,开发一个画图板应用是一项常见的任务,尤其对于教学、设计或创建图形用户界面(GUI)的应用程序。在这个项目中,我们关注的是实现基础的绘图功能,包括绘制直线、曲线和矩形,并允许用户选择线条的...
C#画图板程序是一种基于Microsoft .NET Framework的桌面应用程序,它允许用户通过鼠标或触控设备进行图形绘制。这个程序通常由C#编程语言编写,利用Windows Forms或WPF(Windows Presentation Foundation)框架来...
在这个简易画图板项目中,Java用于实现图形用户界面(GUI)和图形绘制逻辑。 2. **图形用户界面(GUI)**:Java提供了JavaFX和Swing两个主要的库来创建GUI应用。本项目可能使用了Swing,因为它是一个相对成熟的库,...
在画图板工具中,用户可以选择不同颜色和线宽的笔触,填充颜色,以及橡皮擦功能,这些都需要通过GraphicsContext的不同方法实现。 事件处理是JavaFX中另一个关键部分。我们要监听鼠标事件,如mousedown、mousemove...
总之,"MFC简单画图板"是一个基础的图形界面应用实例,它展示了MFC在GUI编程中的应用,对于想要涉足Windows桌面应用程序开发的初学者而言,这是一个不错的实践项目。通过学习和扩展这个应用,开发者不仅可以提升MFC...
在“基于MFC的画图板实现”项目中,主要涉及以下几个关键知识点: 1. **CWinApp**:这是每个MFC应用程序的入口点,负责初始化、运行和结束应用程序。在这个项目中,我们需要创建一个继承自CWinApp的类,用于设置...
在本项目中,“一个Java实现的画图板程序”是一个基于Java开发的图形用户界面应用,它允许用户进行基本的绘图操作,如绘制线条、形状、填充颜色等。这个程序通常会利用Java的AWT(Abstract Window Toolkit)或Swing...
【VC做的画图板程序】是一个基于Microsoft Visual C++(简称VC)的MFC(Microsoft Foundation Classes)框架开发的应用程序。MFC是微软提供的一套C++类库,用于简化Windows应用程序的开发,它封装了Windows API,...
《VC++ 6.0 MFC简易画图板:实现与技术详解》 在软件开发领域,Microsoft Visual C++ 6.0(简称VC++ 6.0)是一款经典的集成开发环境,它提供了强大的MFC(Microsoft Foundation Classes)库,方便开发者构建Windows...
C#是一种面向对象的编程语言,由微软开发,常用于构建桌面应用程序,如本案例中的画图板。 【描述】:“和同学讨了了研究了三天,基本功能都能有,而且还能填充不规则图形颜色,直接修改图片,保存,希望能对大家有...
在Java编程语言中,实现一个简易的画图板是一个经典的GUI(图形用户界面)编程练习。这个项目通常涉及Swing或JavaFX库,这两个库都提供了构建用户界面所需的组件和功能。下面,我们将深入探讨如何使用Java实现这样一...