Как передать объект в орудия и раздать локальный объект?

Как передать объект в агрегат и передать локальный объект объекту, который находится снаружи? Я думаю, что 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 (например, xnew 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 ответа

Решение

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

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

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
    

СЛЕДОВАТЬ ЗА

есть ли обратная сторона в использовании статического класса для вызова свинга?

Только тот, который я определил выше.

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

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

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

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

Пытаться

final Sensors sens = new Sensors();

вместо.

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

Другие вопросы по тегам