Внешнее обновление существующих компонентов JFrame - PullRequest
1 голос
/ 27 февраля 2012

Вот проблема, с которой я сталкиваюсь - у меня есть класс GUI, реализующий JFrame с конструктором, который создает Frame с 9 панелями в GridLayout 3x3. Каждая панель инициализируется в этом конструкторе и имеет своих собственных слушателей и т. Д. Однако, есть пункт меню «Загрузить файл для отображения», но для того, чтобы я мог сохранять / загружать файлы, у меня есть класс, предназначенный для сохранения. и загрузка. Я проверил это, и проблема заключается в том, что когда вызывается метод load в классе save / load, он создает объект GUI, следовательно, повторно создает компоненты GUI. Когда объект GUI используется для вызова метода с именемloadedFile в GUI (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");
}

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 ]

2 голосов
/ 27 февраля 2012

Zeroth, приведите в порядок свой код, используя петли for.

Во-первых, убедитесь, что loadedFile() действительно устанавливает фон для цветов, отличных от белого (для уверенности распечатайте их на консоли).

Во-вторых, вы должны обновить GUI в потоке диспетчеризации событий (EDT) - из вашего кода не ясно, делаете ли вы это.

Вызов repaint() также может быть хорошей идеей после того, как вы установили цвета.

2 голосов
/ 27 февраля 2012

Некоторые рекомендации:

  • Да, используйте цикл for, чтобы исключить 90% вашего избыточного кода и сделать отладку и модификацию (и заставить других читать и понимать ваш код) лот проще.
  • Более важно Я думаю , что вам нужно будет передать ссылки для этой работы, в частности, ссылку на видимый объект GUI на код, который предполагается делатьзагрузка, поскольку вы хотите, чтобы изменения повлияли на видимый в настоящий момент JFrame, правильно?
  • Дайте этому классу GUI открытые методы, которые позволяют другим объектам устанавливать цвет фона его содержимого.Это должен быть неконструктивный метод.

Редактировать 1
Некоторые другие пункты:

У меня есть класс, предназначенный для сохранения ипогрузка.

Хорошо, если вы хотите отделить это от кода GUI (или «просмотра»).

Я проверил это, и проблема заключается в том, что когдавызывается метод load в классе save / load, он создает объект GUI, следовательно, повторно создает компоненты GUI.

Это то, чего я пытаюсь избежать.Вместо этого предоставьте вашему классу Save / Load конструктор, который принимает GUI в качестве параметра, и используйте этот объект GUI (не недавно созданный) для создания файла.

Edit 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);  
  // .....
}
...