从外部更新现有JFrame的组件

时间:2012-02-26 20:31:56

标签: java jframe jpanel external

这是我遇到的问题 - 我有一个实现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");
}

提前感谢任何可以提供帮助的人!

2 个答案:

答案 0 :(得分:2)

一些建议:

  • 是使用for循环消除90%的冗余代码,并使批次更轻松地进行调试和修改(以及让其他人阅读和理解您的代码)。
  • 更重要的是我认为你需要传递引用才能工作,特别是对可见的GUI对象的引用,该代码应该是正在进行加载的代码,因为你需要更改以影响当前可见的JFrame,对吗?
  • 为此GUI类提供公共方法,允许其他对象设置其内容的背景颜色。这应该是非构造函数方法。

编辑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()调用也可能是一个好主意。