簡體   English   中英

如何在不會​​重新繪制的jPanel上繪制某些內容?

[英]How can I draw something on a jPanel that will not be repainted?

我如何在JPanel中繪制將保持不變且不會重新粉刷的東西,我正在執行交通模擬程序,並且希望繪制一次道路,因為它不會改變。 謝謝

據我所知,沒有,除非有透明覆蓋的技巧。

我看到(並且確實)看到的大多數圖形應用程序都只是在每次重畫時重新繪制整個面板。 現在,您可以在圖形緩沖區中執行一次該操作,然后只需將圖形緩沖區復制到JPanel即可立即繪制整個背景。 它應該比調用所有圖形基元來繪制路要快。

或者,某些2D游戲的方式可能是繪制一次並更新活動內容,例如sprites:它需要擦除sprite使用的舊位置(在其中恢復背景)並在新位置重新繪制sprite。 因此,您仍然可以在圖形緩沖區中保留道路的副本,但不必每次都重新繪制整個道路,而只需更新一些小部分。 可以稍微快一點。

我不確定您實際上是否希望永遠不要對道路進行重新粉刷-例如,當您調整窗口大小時,或者在其他窗口將其擋住后,它變得可見時,就會發生重新粉刷事件。 如果您的面板從不重新粉刷,則外觀會很奇怪。

據我所知,Swing只會在這些情況下觸發適當的繪制事件,因此您應該遵循使用適當的重寫對JPanel進行子類化的常規方法:

public class RoadPanel extends JPanel {

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

如果將道路繪制成一次后將其緩存為圖像或其他圖形格式(以節省多次計算顯示數據的次數),則可以節省后續油漆的時間。

每當面板被遮擋時(即框架最小化/另一個窗口置於頂部),都需要重新噴塗該組件。 因此,僅繪制一次內容將無法按您的意願進行。 為了更有效地繪制不變的零件,您可以將它們繪制到“緩沖區”圖像一次,然后在每次需要重新繪制面板或組件時才繪制此緩沖區。

// 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...
}

我要做的是將布爾值設置為某個部分是否需要重繪。 然后,在paintComponent()方法中,我可以檢查該值並重新繪制某些東西。

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

有點像

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM