Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不清理窗户的情况下在Swing中重新喷漆?_Java_Swing_Draw - Fatal编程技术网

Java 如何在不清理窗户的情况下在Swing中重新喷漆?

Java 如何在不清理窗户的情况下在Swing中重新喷漆?,java,swing,draw,Java,Swing,Draw,我正在实现一个简单的画布,在这个画布上,人们可以像在现实生活中一样用纸和铅笔画物品,而不必在每次画物品时清除整个页面 到目前为止我所拥有的 用于实现图形的画布: 公共类画布扩展了JPanel{ 私有最终随机数=新随机数; 公共画布{ setOpaquefalse;//我认为设置此标志可以保留绘制的像素。。。 } @凌驾 公共维度getPreferredSize{ 返回新尺寸640480; } @凌驾 公共空间组件图形{ 超级油漆组件; g、 drawOvalrandom.nextingGetWi

我正在实现一个简单的画布,在这个画布上,人们可以像在现实生活中一样用纸和铅笔画物品,而不必在每次画物品时清除整个页面

到目前为止我所拥有的

用于实现图形的画布:

公共类画布扩展了JPanel{ 私有最终随机数=新随机数; 公共画布{ setOpaquefalse;//我认为设置此标志可以保留绘制的像素。。。 } @凌驾 公共维度getPreferredSize{ 返回新尺寸640480; } @凌驾 公共空间组件图形{ 超级油漆组件; g、 drawOvalrandom.nextingGetWidth,random.nextingGetHeight,5,5; } } 将窗口设置为实际窗口:

公共类窗口扩展了JFrame{ 公共窗口画布{ setDefaultCloseOperationJFrame.EXIT_ON_CLOSE; 添加画布; 收拾 设置VisibleTrue; } } 以及具有应用程序入口点的控制器。还启动计时器,以便每秒调用画布上的重新绘制以强制绘制另一个圆

公共类控制器{ 公共静态无效字符串[]args{ 画布=新画布; SwingUtilities.invokeLater->新建Windowcanvas; 新定时器1000,e->canvas.repaint.start; } }
问题是,每当绘制一个新的圆时,前一个圆就会被清除。似乎仍有一些进程将JPanel或整个JFrame填充为白色。

考虑调用重新绘制的替代构造函数

重新绘制长度tm、绘制x、绘制y、绘制宽度、绘制高度

这允许您设置要重新绘制的指定区域


此外,您还可以将绘制的内容存储在列表中,然后在调用“重新绘制”后将绘制重新打印到画布上。

在Swing中绘制具有破坏性。这是一个预期的要求,即每次对组件进行喷漆时,都要从头开始重新喷漆

您需要定义一个模型来维护从零开始恢复状态所需的信息

然后,绘制例程将迭代此模型并每次绘制元素

这样做的好处是允许您修改模型、删除或插入图元,这将允许您更新简单绘制的内容

或者,您可以使用一个缓冲区,即一个完成所有绘制的BuffereImage,然后在每次绘制组件时,只需将图像绘制到组件


然而,这意味着你不能撤消或分层绘画,它直接绘制到图像上。这也使得调整绘图图像区域的大小变得更加困难,因为您需要手动进行这些更新,而基于模型的实现更具适应性

不幸的是,对于这项任务,我将让列表包含数百万个元素,并在数分钟的长时间内绘制。要重新绘制的指定区域将始终为“无”,因为我希望整个画布在应用程序的整个生命周期中都得到保留。只有手动清理才能填充画布。这个线程似乎可以帮你很多忙。是的,实际上我一直在寻找现有的答案,但以前找不到。我使用BuffereImage制作,似乎没有其他方法可以以干净的方式实现这一点。就个人而言,我会选择一个模型,但我喜欢它的灵活性,但从技术上来说,你可以同时使用这两个,但需要驾驶必须;我的模型是,我需要保存的信息就是图像的当前状态。绘制的所有其他内容都必须绘制在现有内容之上。我永远不需要改变任何现有的位置,但将有数以百万计的组件添加和添加。。。因此,我需要的最大数量的信息可以存储在单个缓冲区中。