我试图通过静态方法设置PanelGen类的所有实例的背景色,以便另一个类可以一次更改所有Panels的颜色。
例如:
PanelGen a = new PanelGen(Color.red);
PanelGen b = new PanelGen(Color.blue);
然后在PanelGen类中: 公共静态无效的changeColor(Color newColor) { //做一些改变a和b颜色的事情 }
这样,外部类(例如“ GameMaster”)可以同时更改a和b的颜色
PanelGen.changeColor(Color.Orange);
答案 0 :(得分:3)
一种方法是在PanelGen类中有一个静态列表。然后在构造函数中,将该值添加到列表中。像这样:
public class PanelGen{
private static List<PanelGen> panelGenList = new ArrayList<>();
private Color color;
public PanelGen(Color c){
color = c;
PanelGen.panelGenList.add(this);
}
public void setColor(Color c){
color = c;
}
public Color getColor(){
return color;
}
public static void changeColor(Color c){
for(PanelGen t: panelGenList)
t.setcolor(c);
}
public static void main(String [] args){
PanelGen a = new PanelGen(Color.red);
PanelGen b = new PanelGen(Color.blue);
System.out.println(a.getColor());
System.out.println(b.getColor());
PanelGen.changeColor(Color.Orange);
System.out.println(a.getColor());
System.out.println(b.getColor());
}
}
答案 1 :(得分:0)
如果所有面板必须具有相同的颜色,则应具有一个颜色实例,而不是尝试同步 N 个不同的实例。
class PanelGen {
static Color colour;
static void changeColour(Color c) { colour = c }
Color getColour() { return colour; }
:
}
可以将getColour
方法声明为static
,但我认为您可能想像实例成员一样使用它。
(是的,颜色/颜色是故意的:-))
答案 2 :(得分:0)
Answer by Justin基本上是正确的,可以正常工作。我有两个问题。
一个我担心的问题是内存泄漏,假设面板可以在应用终止之前被丢弃。
在面板列表中使用弱引用,以避免内存泄漏。
如果面板始终存在直到应用程序执行结束,那么就没有问题。您可以忽略这一点。
另一个关注点是关注点分离。如果面板被设计为具有不同的颜色,但是诸如GameMaster之类的其他实体想要控制所有面板的颜色,则GameMaster类应该包含面板实例的集合,而不是面板上的静态列表类。
然后如何向GameMaster注册每个新面板?如果您只有一个实例化的地方,请将该实体传递给GameMaster的引用以访问其列表并添加新面板。最有可能的是,GameMaster本身就是实例化面板的位置,并且可以在其中注册每个新实例及其面板列表。
顺便说一句,你的名字PanelGen
困扰着我。如果“ gen”是指“ generator”,那么您可能会将面板管理器/生成器与面板混为一谈。在这种情况下,应该有两个类,而不是一个组合。在这种情况下,这是至关重要的一点,正如我们在上面讨论的那样,在哪里分配实例化面板的责任,然后跟踪面板的存在并统一更改其颜色。