这是我遇到的问题 - 我有一个 GUI 类实现 JFrame,其构造函数在 3x3 GridLayout 中构建具有 9 个面板的框架。每个面板都在这个构造函数中初始化并有自己的监听器等。但是,有一个菜单选项可以加载要显示的文件,但是为了让我能够保存/加载文件,我有一个类专门用于保存和加载。我已经测试过了,问题在于当调用save/load类中的load方法时,它创建了一个GUI对象,因此重新制作了GUI组件。当 GUI 对象用于调用 GUI 中称为 loadedFile 的方法 (GUI.loadedFile) 时,程序应该将每个 JPanel 设置为特定的 RGB 值背景。但是,它不会更新我的 JPanel 的背景。这是初始化面板和加载文件代码的构造函数的一部分:
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");
}
加载文件:
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");
}
在此先感谢任何可以提供帮助的人!
最佳答案
一些建议:
- 是的,使用 for 循环消除 90% 的冗余代码并使调试和修改(以及让其他人阅读和理解您的代码)变得更容易很多。
- 更重要的是,我认为您需要将引用传递给它才能工作,特别是将对可见 GUI 对象的引用传递给应该执行加载的代码,因为您需要更改以影响当前可见的 JFrame,对吗?
- 为这个 GUI 类提供允许其他对象设置其内容的背景颜色的公共(public)方法。这应该是一个非构造方法。
编辑 1
其他几点:
I have a class dedicated to saving and loading.
很好,因为您想将其与 GUI(或“ View ”)代码分开。
I've tested it out, and the problem lies in that when the load method in the save/load class is called, it creates a GUI object, hence re-making GUI components.
这就是我想让你避免的。相反,为您的保存/加载类提供一个接受 GUI 作为参数的构造函数,并使用 this GUI 对象(不是新创建的对象)来完成您的工作。
编辑2
请阅读并遵守 Java 命名约定。特别是,类名称应以大写字母开头,变量和方法名称应以小写字母开头。乍一看这似乎微不足道,但如果几年来习惯以这种方式查看代码,就会更容易理解其他人的代码(这通常是一个困难的过程,使用当前的命名方案会变得更加困难)。
编辑 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);
// .....
}
关于java - 在外部更新现有 JFrame 的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9456881/