2008-11-09 113 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... 
}