2011-08-23 118 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的增强也是不错的,如果绘制方法变化很大并且有很不同的目的,那么它的效果会更好。但是,我的建议可能会提供更快的应用程序,并可能允许其他应用程序使用其他应用程序素质特征分析等的情况下,图形状态之间共享的双缓冲代码重用过渡,可变/接近。

什么是你的应用程序在做什么?

问候, 斯特凡