Как передать объект в орудия и раздать локальный объект? - PullRequest
1 голос
/ 20 января 2011

Как передать объект в агрегат и передать локальный объект объекту, который находится снаружи?Я думаю, что SwingUtilities.invokeLater необходим для объекта Swing, верно?

  Sensors sens = new Sensors();

  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    GUI application = new GUI(sens);
    application.getJFrame().setVisible(true);
   }
  });

  SMS sms = new SMS(application);

Это я пытаюсь решить проблему, но я получаю Нет доступного экземпляра типа GUI.Необходимо квалифицировать выделение с включающим экземпляром типа GUI (например, xxnew A (), где x - это экземпляр GUI). проблема.

// in main
Sensors sens = new Sensors();
GUI application = null;
SwingUtilities.invokeLater(new GUIthread(sens , application));
SMS sms = new SMS(application);


//a class inside GUI.java , but not inside GUI class
class GUIthread implements Runnable{
  Sensors s;
  GUI g;
  public GUIthread(Sensors s , GUI g){
   this.s = s;
   this.g = g;
  }

  @Override
  public void run() {
   // TODO Auto-generated method stub
   g = new GUI(s);
   g.getJFrame().setVisible(true);
  }
 }

исходный код

Ответы [ 4 ]

2 голосов
/ 20 января 2011

Эта проблема возникает, когда вы пытаетесь создать экземпляр нестатического внутреннего класса в контексте, который не указывает (или подразумевает) экземпляр включающего класса.

Из этого я делаю вывод, чтовы объявили один из ваших классов нестатическим внутренним классом;например, что-то вроде этого:

public class Outer {
    ...
    public class Inner {
        public Inner() {
           ...
        }
        ...
    }
    ...
}

Если вы сейчас попытаетесь создать экземпляр Inner в каком-то другом коде, используя new Inner(), вы получите ошибку компиляции, подобную той, которую вы видите.

Вы можете сделать одну из двух вещей, чтобы «исправить» проблему:

  • Если вы измените public class Inner { на public static class Inner {, вы можете использовать new Inner() как есть.в настоящее время делает.Но это будет означать, что код Inner не может получить доступ к (окончательным) переменным экземпляра окружающего класса;т.е. Outer.

  • Если вы не хотите изменять Inner на статический класс, вам нужно создать его экземпляр следующим образом:

    Outer outer = ...
    ...
    Inner inner = outer.new Inner();  // qualified creation
    

FOLLOWUP

какой-либо недостаток, использующий статический класс для вызова свинга?

Только тот, который я указал выше.

Итак, все экземпляры происходят внутри Внешнего конструктора?право?

Нет.Код в приведенном выше примере «квалифицированного создания» может появиться везде, где доступен класс Inner.И поскольку мы объявили его как public ...

Если вы создаете экземпляр Inner внутри конструктора (или метода экземпляра) для Outer, вы можете просто использовать new Inner().Включающий экземпляр Outer совпадает с this.

0 голосов
/ 20 января 2011

Я согласен с Заком и подозреваю, что GUIthread - это внутренний класс.Если это так, вы можете преуспеть в том, чтобы сделать его отдельным классом или статическим внутренним классом, но трудно понять, является ли это истинным решением без дополнительной информации и без фактического сообщения об ошибке.

0 голосов
/ 20 января 2011

Легко, объявите ссылку окончательной, и это будет видно по коду класса anon.

0 голосов
/ 20 января 2011

Попробуйте

final Sensors sens = new Sensors();

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...