2011-08-23 85 views
3

我不太確定圖形如何在Java中工作,所以我無法調試我的問題。 我有一個類MyFrame擴展JPanel。現在我在MyFrame上進行一些繪圖保存,並保存有關該特定框架的屬性,然後將其添加到MyFrame的ArrayList集合中。稍後,我想回憶一下MyFrame的某個實例的屬性,並在屏幕上重新繪製該幀。讓框架圖形再次出現是我遇到的問題。保存JPanel圖形

下面是一段代碼,可以證明我的問題。

public class MyFrame extends JPanel{ 
private int property; 
private int x; 
private int y; 

public MyFrame(int xp, int yp){ 
x = xp; 
y = yp; 
} 

@override 
public void paintComponent(Graphics g){ 
super.paintComponent(g); 
g.fillRect(x,y,5,5); 
} 
public void setProperty(int p){ 
property = p; 
} 
} 

public class MainClass() extends JPanel{ 
private ArrayList<MyFrame> frames = new ArrayList<MyFrame>; 
private MyFrame currentFrame = new MyFrame(); 

public void addFrame(int x, int y){ 
this.remove(currentFrame); 
currentFrame = new MyFrame(); 
this.add(currentFrame); 
frames.add(currentFrame); 
} 

public void setFrame(int frame){ 
this.remove(currentFrame); 
currentFrame = frames.get(frame); 
this.add(currentFrame); 
} 

} 

總結: 我想面板以顯示正確的幀時SETFRAME被調用。目前當我做這個設置框架將是空白的。

回答

5

您似乎將JPanel交換出另一個JPanel,並且在執行此操作時,必須考慮容器-Janel使用的佈局,並且需要在容器JPanel上調用revalidate並重新繪製交換。

但是,不要亂用所有這些,爲什麼不通過交換JPanels或JLabels與ImageIcons拿着圖像使用CardLayout輕鬆的路線?

+0

+1'CardLayout'建議。 – mre

+0

@mre:和同上!:) –

+0

什麼是最大媽媽可以放入CardLayout的「卡片」數量。此應用程序的目的是設計逐幀動畫,最終將播放到我正在構建的10x10 RGB LED板。由於這將是潛在的大動畫,肯定會有幾百幀 – kelab

2

你也可以考慮添加一些狀態,一個枚舉數據成員到一個JPanel,並要求它從一個狀態切換到另一個狀態,然後調用它的重繪方法,並在其paintComponent重寫方法中根據其狀態。你的架構(作爲@Hovercraft Full of Eels的增強也是不錯的,如果繪製方法變化很大並且有很不同的目的,那麼它的效果會更好。但是,我的建議可能會提供更快的應用程序,並可能允許其他應用程序使用其他應用程序素質特徵分析等的情況下,圖形狀態之間共享的雙緩衝代碼重用過渡,可變/接近。

什麼是你的應用程序在做什麼?

問候, 斯特凡