我正在做一个简单的网格,每个方格都由光标突出显示: alt text http://img168.imageshack.us/img168/203/screenshottest.png
它们是JLayeredPane中的几个JPanel,mapgrid和overlay,底部是mapgrid。 Mapgrid只是初始化网格,其绘制的元数据是:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
g2d.setColor(new Color(128, 128, 128, 255));
g2d.drawRect(tileSize * j, i * tileSize, tileSize, tileSize);
}
}
在重叠JPanel中突出显示的位置,这是移动鼠标时重新绘制的内容:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(new Color(255, 255, 128, 255));
g2d.drawRect((pointerX/tileSize)*tileSize,(pointerY/ tileSize)*tileSize, tileSize, tileSize);
}
我注意到即使基本图层(mapgrid)在鼠标移动时没有重新绘制,只有透明覆盖图层,性能也不足。如果我给叠加JPanel一个背景,它的速度更快。如果我删除mapgrid Antialiasing,它也会更快一些。
我不知道为什么给叠加层提供背景(因此,隐藏mapgrid)或者在mapgrid中禁用抗锯齿功能会带来更好的性能。
有更好的方法吗?为什么会这样?
答案 0 :(得分:2)
而不是drawRect
你的drawLine
。你应该得到相同的视觉效果,但我认为它会更快。
此外,如果背景始终相同,我建议在初始化时(或调整帧大小时)绘制到缓冲图像,然后只绘制该图像。这应该加速绘图。
答案 1 :(得分:1)
如果所有的Mapgrid都是相同的颜色,请将setColor拉出循环。现在,每次调用paint都会创建新的Color对象。
答案 2 :(得分:1)
我注意到即使是基地 图层(mapgrid)不会重新绘制 鼠标移动,只是透明 覆盖层,性能是 缺乏。
这对我没有意义。由于您的覆盖面板仅为网格执行drawRect(...)鼠标当前已结束,以前的网格如何重置?我猜你在重新绘制覆盖面板时它不是不透明的,在重新绘制覆盖面板上的网格之前,mapgrid必须先重新绘制整个网格。
有更好的方法吗?
跟踪最后绘制的网格。然后,您可以调用重绘(Rectangle)以仅在地图网格面板上重绘该网格。然后,您还可以在覆盖面板上调用重绘(矩形)以重绘覆盖面板上的网格。
如果您需要更多帮助,请发布展示问题的SSCCE。