三种重绘总结:
Q:为什么要重绘?
A:因为在画板上作画的时候图形是保存在缓存里面而不是保存在内存里面的。因此当我们把画板最小化的时候,缓存中储存的图形内容就会被释放清空,但是
内存里面并没有存储数据,所以再恢复窗体的时候只有窗体上的组件会被重绘,图形的内容已经消失。
How to dispose it??
上面说了窗体或者面板会在恢复时自动重绘窗体或者面板上已经添加的组件,这是JPanel里面有一个public void paint(Graphic g){}
方法,所以我们在画图的时候把图形内容(或者数据)保存以后,在JPanel调用paint方法是顺便把图形重绘出来,这就达到我们的目的。
No、1 直接存储
我们在绘图的时,每画一个图,就创建一个图形对象,把绘图时的数据(坐标、颜色、绘图动作命令等)保存起来,存入一个队列中,在重绘遍历这个队列
,把存储的图形内容输出,在绘制一遍。
缺点:存储的内容繁多,比如存储多边形的时候那个纠结。还有在重绘的是哦户还要把存储的瘦取出来再绘制一遍,那么原来绘制的方法得再写一遍,繁杂!
//**********************代码略************//
No、2 存储图像像素
我们重绘的目的,只要求重绘的画图面板上的内容,那么我们只需把画图面板上的图像(由很多像素点组成)内容用数组存储起来,重绘时,在paint()中
又把数组中的内容遍历出来,这样就行了。
优点:存储的内容单一,只是像素点对应的颜色而已,到时候把像素颜色遍历一遍放在面板上就OK了~~~
//**************重绘操作****************//
//需要重写继承了JPanel类的MyPanel类的paint()方法,在MyPanel面板对象调用paint()方法时完成重绘操作
//写一个类继承JPanel,重写JPanel的paint方法
class MyPanel extends JPanel{
// 重写绘制组件的方法
//当然这面板主要是取得画布绘画,没有添加其他组件
//因为JPanel里面的paint方法只会重绘组件,所以我们在“画图”的同时存储画布图像,"它"重绘组件时我们就顺便把图形再画出来
public void paint(Graphics g) {
// 调用父类的绘制方法来正确的绘制组件本身
super.paint(g);
// 当需要重新绘制的时候就将二维数组中的数据绘制一次\
//System.out.println("listener="+listener);
if (listener != null) {
// 获取监听器中的二维数组
int[][] data = listener.data;
//System.out.println("data="+data);
if (data != null) {// 如果已经保存了数据,才需要绘制
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
int cNum = data[i][j];
// 创建颜色对象
Color color = new Color(cNum);
g.setColor(color);
// 绘制点
g.drawLine(j, i, j, i);
}
}
}
}
}
}
//******************截屏存储操作******************//
Object object = e.getSource();
JPanel drawpanel = (JPanel)(object);
//获取到drawpanel的左上角相对于屏幕的坐标点
Point point = drawpanel.getLocationOnScreen();
//获取到drawpanel的面积大小
Dimension dimension = drawpanel.getPreferredSize();
//创建一个要截取的区域,相当于是一个屏幕裁剪模具
Rectangle rect = new Rectangle(point,dimension);
//画完一个图形之后就把图像截取下来
BufferedImage cut_image = robot.createScreenCapture(rect);
data = new int[cut_image.getHeight()][cut_image.getWidth()];
for (int i=0;i<data.length;i++)
for (int j=0;j<data[i].length;j++){
int RGB = cut_image.getRGB(j, i);
data[i][j] = RGB;
}
No、3 存储图像
方法2的改进:为何在去图像是不直接把图像存储起来,重绘时直接把图像“贴”在面板上上呢?
分享到:
相关推荐
这时,可以使用`repaint()`方法来触发重绘,这个方法会调用`update()`。如果需要提高性能,可以考虑使用double buffering技术,通过在内存中先完成所有绘图,然后一次性将结果绘制到屏幕,减少闪烁和卡顿。 标签中...
1.4 小结 第2章 Java面向对象编程 2.1 面向对象的一些概念 2.1.1 面向对象涉及的概念 2.1.2 类和对象 2.2 面向对象的一些特性 2.2.1 继承特性 2.2.2 多态特性 2.2.3 封装特性 2.3 Java中实现的面向对象特性 2.3.1 ...
- 第4题涉及绘图,需要理解Graphics2D API,响应鼠标事件并进行重绘。 - 第5题要求绘制网格,需要熟练掌握Graphics的drawLine方法。 在解答这些题目时,学生需要结合Java的基础知识和实践经验,运用面向对象的...
**6.6 小结** 总结来说,Java低级用户界面和事件处理允许开发者更深入地控制界面的每一个细节,以创建独特且功能丰富的应用。然而,这种方式也意味着更高的复杂性和可能的性能挑战,因为开发者需要处理更多的底层...
9. **设计报告**:设计报告包括设计任务、总体方案、面向对象的设计、源代码注释、主要模块流程图、问题分析与解决方案、小结与体会等内容,是项目开发过程的总结,展示了开发者的设计思路和技术实现。 10. **文档...
- 继承自`JPanel`的`paint`方法,用于重绘面板。 - 绘制玩家生命值条、分数等UI元素。 - 根据玩家坦克的方向和颜色绘制坦克。 - 绘制坦克的细节部分,如轮子等。 #### 实现接口 - **`KeyListener`**:处理键盘输入...
1.6 本章小结································· (9) 习题1···································· (9) 第2章 Java语言基础········...
- **OnPaint()` 方法**:处理重绘窗口的消息。 - **OnQueryDragIcon()` 方法**:返回用于拖动图标的图标句柄。 ### 语音聊天功能 - **WM_DATAREACH 定义**:定义了一个自定义消息`WM_DATAREACH`,用于接收数据到达...
**小结** J2ME的低级用户界面和事件处理提供了更底层的控制,允许开发者实现高度定制的界面和交互,但同时也带来了更高的复杂性和较低的可移植性。理解和掌握这些概念,是成为专业J2ME开发者的关键步骤。
在 moveBall() 函数中,使用 `ballX++` 语句来控制小球的横坐标,并使用 `repaint()` 语句来重绘小球。在 paint() 函数中,使用 `g.fillOval(ballX, 0, 30, 30)` 语句来绘制小球。 四、小结 本资源旨在通过异或...
20.5 本章小结 这部分会总结本章所学习的主要概念和技术,包括随机数生成、图形绘制、多线程和动画控制。这些都是构建复杂GUI应用的基础。 20.6 实训:编写动画程序 实践是检验理论的最好方式,通过实际编写动画...
- 通过不断重绘画布来更新游戏画面。 - 调用 `move_sq()` 方法移动方块。 - 使用 `Thread.sleep()` 控制游戏的速度。 #### handleEvent() 方法 ```java public boolean handleEvent(Event e) { if (e.id == Event...
#### 七、小结 本文介绍了Android中线程的相关概念、使用方法及其同步机制。合理运用线程不仅可以提高程序的性能,还能增强用户体验。在实际开发中,应根据具体需求选择合适的线程模型和技术方案。
\1.4 小结 13 \第2章 对话框——QDialog 14 \2.1 自定义对话框 14 \2.1.1 建立新类 14 \2.1.2 添加子窗口部件 15 \2.2 加入主程序 22 \2.3 Qt内建(built-in)对话框 24 \2.4 小结 34 \第3章 基础窗口部件——...
\1.4 小结 13 \第2章 对话框——QDialog 14 \2.1 自定义对话框 14 \2.1.1 建立新类 14 \2.1.2 添加子窗口部件 15 \2.2 加入主程序 22 \2.3 Qt内建(built-in)对话框 24 \2.4 小结 34 \第3章 基础窗口部件...
- 设计一个小人在曲线上运动,直至到达终点再从头开始,这涉及到动画帧的概念,可能使用定时器更新小人的位置,并用重绘方法在每次移动后更新Applet的画面。 4. **设计与实现**: - 首先,需要进行需求分析,理解...
此外,应当避免在循环中进行DOM操作,如果必须在循环中进行DOM操作,应当考虑将操作集中处理,以减少浏览器的重绘和回流次数。还有,应当尽可能使用事件委托来减少事件处理器的数量,这不仅能够减少内存的使用,还...
1.7 小结 27 1.8 本章主要内容 28 第2章 数据、变量和计算 29 2.1 C++程序结构 29 2.1.1 main()函数 36 2.1.2 程序语句 36 2.1.3 空白 38 2.1.4 语句块 38 2.1.5 自动生成的控制台程序 39 2.2 定义变量 40 ...