2008-11-09 125 views

回答

3

我不确定你是否真的想让你的道路永远不会被重新粉刷 - 例如,当你的窗口被调整大小时,或者在另一个窗口阻挡它时,它会变得可见,重新绘制事件。如果你的面板从不重绘,那么它看起来很奇特。

至于我记得,秋千才会触发适当的绘画事件这样的情况下,所以你应该以下子类JPanel的用合适的替代通常的方法是确定:

public class RoadPanel extends JPanel { 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     // your drawing code here 
    } 
} 

如果缓存的路转换为图像或其他图形格式(以节省多次计算显示数据),一次绘制后,这可能会为您节省下一段时间的绘制时间。

3

据我所知,没有,除非有一个透明的覆盖技巧。

我看到(并且确实)的大多数图形应用程序只是在每次重绘时重新绘制整个面板。现在,您可以在图形缓冲区中执行一次,然后通过将图形缓冲区复制到JPanel来快速绘制整个背景。它应该比调用所有图形基元来绘制道路更快。或者,某些2D游戏的做法,可能只画一次,然后更新移动的部分,如精灵:它需要擦除精灵使用的旧地点(在那里恢复背景)并重新绘制精灵新的地方。因此,您仍然拥有图形缓冲区中的道路副本,但不是每次重新绘制整个道路,只更新一些小部分。可以稍快一点。

1

我所做的是设置一个布尔值,以确定某个部分是否需要重绘。然后,在paintComponent()方法中,我可以检查值并重绘某些东西,或不。

protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    if (drawRoad) { 
     drawRoadMethod(g); 
    } 
    drawTheRest(g); 
} 

有点像那样。

3

每次面板被遮挡时(例如,框架最小化/另一个窗口放在顶部),组件需要重新绘制。因此只绘制一次东西不会像你想要的那样工作。为了使不改变的部分得到更有效的绘制,您可以将它们绘制成一个“缓冲”图像,然后每次需要重绘面板或组件时绘制该缓冲区。

// Field that stores the image so it is always accessible 
private Image roadImage = null; 
// ... 
// ... 
// Override paintComponent Method 
public void paintComponent(Graphics g){ 

    if (roadImage == null) { 
     // Create the road image if it doesn't exist 
     roadImage = createImage(width, height); 
     // draw the roads to the image 
     Graphics roadG = roadImage.getGraphics(); 
     // Use roadG like you would any other graphics 
     // object to draw the roads to an image 
    } else { 
     // If the buffer image exists, you just need to draw it. 
     // Draw the road buffer image 
     g.drawImage(roadImage, 0, 0, null); 
    } 
    // Draw everything else ... 
    // g.draw... 
} 
相关问题