这是我遇到的问题 - 我有一个实现JFrame的GUI类,其构造函数在3x3 GridLayout中构建具有9个面板的Frame。每个Panel都在这个构造函数中初始化,并有自己的监听器等。但是,有一个菜单选项可以加载要显示的文件,但是为了能够保存/加载文件,我有一个专门用于保存的类和装载。我已经测试了它,问题在于当调用save / load类中的load方法时,它会创建一个GUI对象,从而重新制作GUI组件。当GUI对象用于在GUI(GUI.loadedFile)中调用名为loadedFile的方法时,程序应该将每个JPanel设置为某个RGB值背景。但是,它不会更新我的JPanel的背景。下面是构造函数的一部分,用于初始化面板和loadedFile代码:
A1 = new JPanel();
A1.addMouseListener(mouseListener);
A1.setBackground(Color.WHITE);
add(A1);
A2 = new JPanel();
A2.addMouseListener(mouseListener);
A2.setBackground(Color.WHITE);
add(A2);
A3 = new JPanel();
A3.addMouseListener(mouseListener);
A3.setBackground(Color.WHITE);
add(A3);
B1 = new JPanel();
B1.addMouseListener(mouseListener);
B1.setBackground(Color.WHITE);
add(B1);
B2 = new JPanel();
B2.addMouseListener(mouseListener);
B2.setBackground(Color.WHITE);
add(B2);
B3 = new JPanel();
B3.addMouseListener(mouseListener);
B3.setBackground(Color.WHITE);
add(B3);
C1 = new JPanel();
C1.addMouseListener(mouseListener);
C1.setBackground(Color.WHITE);
add(C1);
C2 = new JPanel();
C2.addMouseListener(mouseListener);
C2.setBackground(Color.WHITE);
add(C2);
C3 = new JPanel();
C3.addMouseListener(mouseListener);
C3.setBackground(Color.WHITE);
add(C3);
System.out.println("GUI() invoked");
}
loadedFile:
public void loadedFile(int[] colors) {
int counter = 0;
//if in a different pain program using JPanels in an array for larger canvases,
//use the JPanel[counter] set to colors[counter] for BG color. Also, enhanced
//for loop could cycle through he values of panels array and set BG.
A1.setBackground(new Color(colors[counter], colors[counter+1], colors[counter+2]));
counter+=3;
A2.setBackground(new Color(colors[counter], colors[counter+1], colors[counter+2]));
counter+=3;
A3.setBackground(new Color(colors[counter], colors[counter+1], colors[counter+2]));
counter+=3;
B1.setBackground(new Color(colors[counter], colors[counter+1], colors[counter+2]));
counter+=3;
B2.setBackground(new Color(colors[counter], colors[counter+1], colors[counter+2]));
counter+=3;
B3.setBackground(new Color(colors[counter], colors[counter+1], colors[counter+2]));
counter+=3;
C1.setBackground(new Color(colors[counter], colors[counter+1], colors[counter+2]));
counter+=3;
C2.setBackground(new Color(colors[counter], colors[counter+1], colors[counter+2]));
counter+=3;
C3.setBackground(new Color(colors[counter], colors[counter+1], colors[counter+2]));
System.out.println("BGS SET");
}
提前感谢任何可以提供帮助的人!
答案 0 :(得分:2)
一些建议:
编辑1
其他一些观点:
我有一个专门用于保存和加载的课程。
很好,因为你想将它与GUI(或“视图”)代码分开。
我已经测试了它,问题在于当调用save / load类中的load方法时,它会创建一个GUI对象,从而重新制作GUI组件。
这就是我想让你避免的。而是为您的Save / Load类提供一个构造函数,该构造函数接受GUI作为参数,并使用此 GUI对象(而不是新创建的对象)来做您的客户。
编辑2
请阅读并遵守Java命名约定。特别是,类名应以大写字母开头,变量和方法名称应以小写字母开头。这一开始看起来似乎微不足道,但是如果一个人习惯于用这种方式看几年的代码,那么理解其他人的代码会更加容易(对于你当前的命名方案来说,这通常是一个困难的过程)。 / p>
编辑3
更具体地说,我建议这样的事情:
public class SaveLoad { // or whatever its called
private GUI gui; // give it a GUI variable
public SaveLoad(GUI gui) {
this.gui = gui; load in the current GUI into save load
// ... other code ...
}
public void load() {
// get the colors
gui.loadColors(...); // method called on the visualized GUI.
然后你可能会像这样创建SaveLoad:
public void actionPerformed(ActionEvent evt) {
// inside some event listener
SaveLoad saveload = new SaveLoad(GUI.this);
// or just this if not in an inner class then just use this
// SaveLoad saveload = new SaveLoad(this);
// .....
}
答案 1 :(得分:2)
Zeroth,使用for
循环整理您的代码。
首先,检查loadedFile()
是否确实将背景设置为白色以外的颜色(将它们打印到控制台以确定)。
其次,您应该更新事件调度线程(EDT)中的GUI - 从您的代码中不清楚您是否正在执行此操作。
设置颜色后,repaint()
调用也可能是一个好主意。