[英]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.