做过简单画板后,就会发现,当窗体缩放或最小化之后,所绘制的图形都会消失,这是因为所绘制的图形并没有存放到内存中,所以当窗体改变后就没有数据来让它重绘。那为了解决这一问题,最直截了当的方法就是用一个队列来储存所绘过的数据,在重绘时将这些数据再一次“画”出来。
[注]:这里为了更明白的显示重绘的代码,画图板只绘制直线。
首先要创建一个储存图形对象的队列,我们以前做的队列是String型的,那为了提高它的利用率,就可以把它改成不定型(E)的,即自定义泛型队列。代码如下:
public class MyArray<E>{ Object[] a = new Object[0]; //装数据的方法 public void add(E s){ Object[] tem = new Object[a.length+1]; for(int i=0;i<a.length;i++) tem[i]=a[i]; tem[a.length]=s; a=tem; } // 取出对应下标的元素 public E get(int index){ if(index<0||index>=a.length){ throw new RuntimeException("传入的下标超出边界:"+a.length); } return (E)a[index]; } // 返回容器中的元素个数 public int size(){ return a.length; } }
那么,我们就需要在Drawline这个类中定义一个用来保存形状对象的队列,这时E就变成我们所需要的shape型了:
public static MyArray<Shape> shapes = new MyArray<Shape>();
既然我们使用了shape这一个类型,就要创建相应的shape类,这个类中要有画线的方法:
public class Shape { int x1,y1,x2,y2; public void draw(Graphics g){ g.drawLine(x1, y1, x2, y2); } }
这样,准备工作就做好了,我们可以往画板的代码中加入重绘的成分。在监听器中将形状对象存入队列:
public class DrawListener implements MouseListener { //定义属性,储存坐标 static int x1,y1,x2,y2; //定义绘制图形图像对象的属性 private Graphics g; //构造绘制图形图像的方法 public DrawListener(Graphics g){ this.g=g; } public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub //获取鼠标按下时的坐标值 x1 = e.getX(); y1 = e.getY(); } public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub //获取鼠标释放时的坐标值 x2 = e.getX(); y2 = e.getY(); //创建直线对象 Shape sh = new Shape(); sh.x1=x1; sh.y1=y1; sh.x2=x2; sh.y2=y2; //绘制形状 sh.draw(g); //将形状对象存入队列 Drawline.shapes.add(sh); } }
[注]: 继承MouseListener所需要实现的其它方法这里就不一一列出了。
最后,只要在Drawline这个类中加入如下代码即可:
//获取画布对象 Graphics g = this.getGraphics(); //重写绘制窗体的方法 public void paint(Graphics g){ //调用父类的方法来绘制窗体 super.paint(g); for(int i=0;i<shapes.size();i++){ Shape sh = shapes.get(i); //绘制形状 sh.draw(g); } }
这样,我们就完成了简单画板的一种重绘。
相关推荐
在计算机图形学和用户界面设计中,"闪屏"是一个常见的问题,特别是在应用程序进行重绘时。这通常表现为屏幕上的内容快速闪烁或者不连续的变化,影响用户体验。本实例程序主要针对这个问题提供解决方案,旨在帮助...
此外,注意绘图操作不应该直接在`Frame`的`Graphics`对象上进行,因为这会导致绘图在每次重绘时消失。通常应使用`BufferedImage`或其他绘图组件,然后在需要时更新`Frame`的内容。这个简单的示例仅用于演示UDP同步的...
当数据源发生变化时,可以通过数据模型的更新触发列表框的重绘,如Java的`ListModel`。 2. **多态视图**:在某些场景下,列表框的每一项可能需要有不同的展示形式,这可以通过实现自定义的列表渲染器来实现。 3. *...
Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建...
Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建...
Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建...
Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建...
Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建...
Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建...
Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建...
【描述】:"主循环里,requestAnimationFrame 在所有形状都不需要重绘的时候暂停。" 这段描述揭示了轻量级绘图库的一个关键优化策略。`requestAnimationFrame`是JavaScript中用于在下一次重绘之前执行动画或更新UI...
Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建...
综上所述,"Java时钟小程序"利用了Java的Swing库构建GUI,使用Timer定时器以非阻塞方式周期性更新时间,并在UI线程安全地重绘时钟界面,以达到模拟实际时钟的效果。通过理解这些概念,你可以构建出一个功能完善的...
在这个项目中,源代码会包含GUI设计,例如使用JPanel、JFrame等组件来构建游戏界面,通过重绘(paintComponent)方法来更新游戏画面。 学习这个源代码,开发者可以深入了解JAVA的游戏开发技巧,如: 1. 如何利用...
3. **动画线程**:创建一个`Thread`或使用`ExecutorService`,在线程的`run()`方法中,不断更新`textPosition`,然后调用`repaint()`触发界面重绘。 4. **线程同步**:确保在更新`textPosition`和调用`repaint()`时...
Java的AWT和Swing库提供了图形用户界面(GUI)的支持,其中的Component类提供了repaint()方法,用于触发组件的重绘。每当游戏状态发生变化时,调用这个方法可以使屏幕上的图像更新,保持画面同步。 提示功能则涉及...
为了实现动画效果,程序会定期调用`repaint()`方法来重绘组件,每次重绘时根据时间或计数器更新位置,从而产生运动的假象。`paint()`或`update()`方法会被覆盖,以在每次重绘时执行必要的绘图操作。 为了使动画更具...
总的来说,`paint`和`repaint`是Java GUI编程中图形更新的关键工具,`paint`用于实际的绘图操作,而`repaint`则负责调度和管理组件的重绘过程。正确理解和使用这两个方法能够帮助你创建动态且高效的图形用户界面。
Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建...
Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建...