我想在墙上画些东西 JPanel
阅读和练习表演风俗画课。当它更新广场使用 repaint
我觉得,使用这个结构
private void moveSquare(int x, int y) {
if ((squareX != x) || (squareY != y)) {
squareX = x;
squareY = y;
repaint();
}
}
为这个具体的例子提供了比推荐的更好的油漆性能
private void moveSquare(int x, int y) {
int OFFSET = 1;
if ((squareX != x) || (squareY != y)) {
repaint(squareX, squareY, squareW + OFFSET, squareH + OFFSET);
squareX = x;
squareY = y;
repaint(squareX, squareY, squareW + OFFSET, squareH + OFFSET);
}
}
如果我使用后一个,正方形在拖动过程中看起来有些“挤压”。
我知道,这是一个非常基本的例子,但是它让人们对java图形的性能有点恐惧。
2条答案
按热度按时间kpbpu0081#
做两次重绘是不自然的。
什么时候才重新粉刷新老广场的结合?
当正方形相对较小或超出显示区域(剪裁)时,这应该更平滑。
rggaifut2#
no arg和
paint()
带参数的是,带参数的将在对的后续调用中设置剪裁区域paint()
. 油漆性能的差异(如果有的话)将取决于paint()
方法实际上考虑了裁剪区域,或者只是绘制整个绘图区域,然后离开平台来计算该区域是否需要更新。许多javaawt/spring组件忽略了裁剪区域,只绘制整个区域。这样做有时比精确地计算出如何重新绘制显示区域的特定部分要快。如果组件是您自己编写的,并且您知道您没有在其中测试剪裁区域
paint()
,那你就知道你打电话和不打电话没什么区别了repaint()
有没有争论。另一方面,如果你在
paint()
实现时,要精确地计算出如何重新绘制子区域,那么您就必须自己尝试计算出如何最好地调用repaint()
.如果您没有编写组件,那么可能知道是否最好指定重绘区域,除非通过测试或仔细检查源代码(如果您有)。
如果使用
repaint()
带参数会导致绘制一个扭曲的图像,这可能指向一个缺陷paint()
实施。