起初的画板设计,由于系统缓存的局限,缩放画板窗体后便不能呈现画板上的对象,鉴于此,需要我们改进画板。
引进自定义队列,我们就可以“记住”画板上已画的图案,并重绘出来显示在原窗体上。
先创建一个DrawUI类,完成一般画板工作,代码如下:
import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import javax.swing.JButton; import javax.swing.JFrame; /** * 画图板重绘 * * @author Administrator */ @SuppressWarnings("serial") public class DrawUI extends JFrame{ public static void main(String args[]) { new DrawUI(); } /** *初始化界面 */ public DrawUI() { this.setTitle("画图板界面"); this.setSize(600, 500); this.setDefaultCloseOperation(3); //设置布局 FlowLayout layout = new FlowLayout(); this.setLayout(layout); JButton line = new JButton("直线"); //设置按钮的动作命令 line.setActionCommand("line"); JButton rect = new JButton("矩形"); rect.setActionCommand("rect"); this.add(line); this.add(rect); this.setVisible(true); //创建动作监听器,加在按钮上 ButtonListener blis = new ButtonListener(); line.addActionListener(blis); rect.addActionListener(blis); //从窗体上获取画布对象 //获取窗体在屏幕上所占据的区域,这块区域是允许改变颜色的 java.awt.Graphics g = this.getGraphics(); DrawListener dlis = new DrawListener(g,blis,this); //给窗体添加鼠标监听器 this.addMouseListener(dlis); } }
这样的画板我们是不能“记住”所绘的图案的 。需要插入自定义队列来暂时保存信息。
所以我们需要重写JFrame类中的用来绘制窗体的方法,加在DrawUI类后,代码如下:
/** * 重写JFrame类中用来绘制窗体的方法 */ public void paint(Graphics g){ //调用父类的方法来正确的绘制窗体 super.paint(g); //如果数组存在,就重绘数据 if(null!= DrawListener.image){ //重绘数组 for(int i=0;i<DrawListener.image.length;i++){ for(int j=0;j<DrawListener.image[i].length;j++){ //获取颜色 int c =DrawListener.image[i][j]; //创建颜色对象 Color color = new Color(c); g.setColor(color); g.drawLine(j, i, j, i); } } } }
但是,这样的代码还是有错的,DrawListener和ButtonListener监听器所在的类需要我们补充完整,代码如下:
import java.awt.AWTException; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; /** * 画板的监听器类,实现鼠标监听器接口 * * @author Administrator * */ public class DrawListener implements java.awt.event.MouseListener { private int x1,y1,x2,y2; private Graphics gr; private ButtonListener blis; private String type = "rect";// 要绘制的形状 rect 矩形 oval 椭圆 private DrawUI du; java.awt.Robot robot; public static int image[][]; //创建监听器对象的时候要求传入一个画布对象 public DrawListener(Graphics gr,ButtonListener blis,DrawUI dlis){ this.gr = gr; this.blis = blis; this.du = dlis; try{ robot = new java.awt.Robot(); }catch(AWTException e){ e.printStackTrace(); } } public DrawListener(Graphics g, ButtonListener blis2, DrawListener dlis) { } public void mousePressed(MouseEvent e){ // 鼠标按下时候光标的位置 x1 = e.getX(); y1 = e.getY(); } public void mouseReleased(MouseEvent e) { // 绘制之前先确定要绘制的形状类型 type = blis.command; gr.setColor(new Color(0, 0, 0)); // 鼠标释放时候光标的位置 x2 = e.getX(); y2 = e.getY(); if (type.equals("line")) { // 画直线 gr.drawLine(x1, y1, x2, y2); } else if (type.equals("rect")) { for (int i = 0; i < 200; i++) { gr.setColor(new Color(i, i, i)); gr.drawRect(Math.min(x1, x2) + i, Math.min(y1, y2) - i, Math .abs(x2 - x1), Math.abs(y2 - y1)); } }else if (type.equals("oval")){ gr.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1)); } // 获取窗体左上角的位置和窗体大小 Point p = du.getLocationOnScreen(); Dimension dim = du.getSize(); // 创建矩形对象 java.awt.Rectangle rect = new java.awt.Rectangle(p, dim); // 截取屏幕 BufferedImage img = robot.createScreenCapture(rect); image = new int[img.getHeight()][img.getWidth()]; //将图像按照像素分割成一个一个的点,将点的颜色存入数组 for(int i=0;i<image.length;i++){ for(int j=0;j<image[i].length;j++){ //将颜色存入数组 image[i][j] = img.getRGB(j, i); } } } public void mouseEntered(MouseEvent e) { // System.out.println("mouseEntered"); } public void mouseExited(MouseEvent e) { // System.out.println("mouseExited"); } public void mouseClicked(MouseEvent e) { // System.out.println("mouseClicked"); } }
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * 按钮的监听器 * * @author Administrator * */ public class ButtonListener implements ActionListener { public String command; public void actionPerformed(ActionEvent e) { // 获取被点击的组件上的动作命令 command = e.getActionCommand(); System.out.println(command); } }
可以看到,在DrawListener类中完成了画板重绘。
代码运行后,显然还是不能满足我们的需求,因为缩放后队列是按一定顺序依次展开呈现的,而不是一次全部展现,这需要我们更向前一步,在创建队列“记住图案”后能快速重绘。
我的想法是不从自定义队列方面下手,因为队列鉴于其本质是一定先后顺序的先进先出的线性表,而这不可避免的会产生延迟,达不到我们的要求,而引进某种其他工具,能多维的,没有先后之分的拷贝窗体上的信息,这样既满足我们的要求,效率又得到了大大提高。
相关推荐
4. **事件处理**:在易语言中,我们需要监听窗口或画板的特定事件,比如“窗口初始化”或“画板重绘”。在这些事件的处理函数中,我们可以调用绘制函数来更新进度条的显示。 5. **进度更新**:当程序执行的任务进度...
在易语言中,我们可以通过编写事件处理程序,如“画板重绘”事件,来控制画板上的内容显示。 制作进度条的关键步骤包括以下几个方面: 1. **创建画板组件**:在易语言的界面设计中,添加一个画板组件到窗体上,...
易语言画板自绘源码,画板自绘,标尺子程序_绘制标尺刻度,恢复鼠标状态,无拖动时激活恢复,刻度区重绘,客户区重绘,二级缓冲绘制,客户区刷新,选中辅助线,高亮辅助线,拖动辅助线,客户绘制的图形,GetProp,SetRect,SetProp,...
4. **内存位图**:为了提高效率和避免频繁的屏幕重绘,通常会使用内存位图来保存当前画板的状态。当需要更新画板时,将内存位图的内容复制到窗口上,而不是重新绘制所有图形。 5. **文本处理**:除了图形绘制,自绘...
在易语言中,开发者需要理解窗口消息机制,比如WM_PAINT消息,这是窗口需要重绘时发送的消息。收到该消息后,开发者需要在OnPaint事件中执行自绘代码,确保界面的更新。同时,界面的绘制应考虑效率,避免不必要的重...
3. 事件响应:设置画板的绘图事件,如WM_PAINT消息,当需要更新画布时,调用绘制逻辑函数进行重绘。 4. 数据管理:存储列表项的数据结构,如数组或列表,用于驱动绘图逻辑。 5. 用户交互:处理鼠标和键盘事件,使...
1. **自绘机制**:自绘的核心在于响应窗口的重绘事件,通过`窗口过程`函数捕获并处理这些事件。在易语言中,你需要覆盖默认的绘制行为,使用`画图`命令绘制列表框的背景、条目和选中状态。 2. **列表重画**:在列表...
在这个“易语言画板自绘列表”主题中,我们主要讨论的是如何在易语言环境下创建和操作自绘列表,这涉及到多个核心概念和技术。 首先,**画板**是编程中常见的一种图形用户界面(GUI)组件,它允许程序员在上面进行...
在这个源码中,开发者需要实现OnPaint事件,该事件会在控件需要重绘时被触发,用于执行实际的绘图操作。 2. **图形API的使用**:易语言提供了丰富的图形API,如画线、画圆、填充颜色等。这些函数可以用来在控件上...
6. **图形缓存**:掌握如何利用内存中的位图进行图形缓存,提高界面重绘性能。 7. **界面交互设计**:设计并实现用户与自绘界面的交互逻辑,如按钮点击、拖放操作等。 8. **源码分析**:通过对提供的源码进行分析...
在VS2015环境下,利用MFC框架实现的一款高仿“画图”工具,实现绝大部分功能甚至更多创新点。(注释超详细) 实现了点、直线、曲线、折线、矩形、圆形、多边形等等形状,并且具有区域限制、鼠标捕捉等功能;...
2. **事件驱动编程**:易语言是基于事件驱动的,源码中会包含各种事件处理函数,如`鼠标点击事件`、`窗口重绘事件`等。这些事件触发相应的绘图操作,实现动态效果。 3. **坐标系统和绘图模式**:了解易语言中的坐标...
1. **注册消息处理**:首先,我们需要注册WM_PAINT消息,当系统需要重绘列表框时,会发送这个消息。在易语言中,这通常通过`窗口过程`或`消息过滤`函数实现。 2. **初始化画笔和刷子**:在自绘开始前,我们需要设置...
在易语言中,画板通常会有一个与之关联的事件,例如“画板重绘”事件,当画板需要更新时(如滚动条移动),这个事件会被触发。在这个事件处理程序中,我们会根据滚动条的位置来决定应该在画板上显示哪一部分的图片。...
6. **优化性能**:自绘可能会带来额外的性能开销,因此在实现自绘编辑框时,需要注意尽可能减少不必要的重绘,例如使用更新区域或者双缓冲技术来提高效率。 7. **兼容性与扩展性**:自绘编辑框可能需要考虑与其他...
易语言中的事件处理是编程的核心部分,比如"画板重绘"事件,当画板需要更新时,会触发这个事件,我们在这里编写绘制列表的代码。此外,还有"鼠标点击"事件,可以用来处理用户的交互,如选择列表项。 再者,要掌握...
- 使用离屏渲染优化,避免在屏幕更新时频繁的重绘操作。 - 如果可能,可以采用OpenGL或Metal进行更底层的图形处理,提升性能。 11. **测试与适配**: - 在不同尺寸和分辨率的设备上进行测试,确保界面适应性和...
3. 处理绘图事件:在画板的"画板重绘"事件中,首先清空画板(通常用白色填充),然后根据需要调整画笔的颜色、透明度等属性。接着,使用"绘制文本"命令在画板的指定位置绘制标签的内容。 4. 实现透明效果:透明度...
2. **绘制列表项**:在画板的重绘事件中,我们需要遍历数据源,根据每一项数据的内容和格式,在画板上进行绘制。这可能涉及到字符串格式化、字体设置、颜色选择等细节。 3. **滚动处理**:为了实现滚动功能,需要...