java - 在外部更新现有 JFrame 的组件

标签 java jframe jpanel external

这是我遇到的问题 - 我有一个 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/

相关文章:

java - 使用谷歌播放服务时出现安卓磨损错误

java - 为什么初始化字符串后得到 null?

Java 正则表达式 : Matching the beginning of a line

swing - 可以在 JDesktopPane 中添加哪些组件?

java - 根据 JLabel 内容对面板进行排序

java - JDBC 驱动程序是否为 Postgres 执行自动类型转换

java - KeyListener 和 jframe 的问题

java - 如何将击键 Z 添加到 keyPressed(KeyEvent e) 以将球跳跃/重新绘制到新的随机位置? (使用了 KeyListener 演示。)

java - JFrame 主题和外观

java - 根据 JList 值将 JButton 动态添加到 JPanel