我正在做一个简单的网格,每个正方形都用光标突出显示:
它们是几个JPanels,mapgrid和JLayeredPane内的叠加层,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中禁用抗锯齿会导致更好的性能。
有一个更好的方法吗?为什么会这样?
最佳答案
您可以使用drawRect
代替drawLine
。您应该获得相同的视觉效果,但我认为它将更快。
另外,如果背景始终相同,我建议在初始化时(或调整帧大小时)绘制到缓冲的图像,然后再绘制该图像。这样可以加快绘图速度。