Как передать объект в орудия и раздать локальный объект?
Как передать объект в агрегат и передать локальный объект объекту, который находится снаружи? Я думаю, что 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 - это внутренний класс. Если это так, вы можете преуспеть в том, чтобы сделать его автономным или статическим внутренним классом, но трудно понять, является ли это истинным решением без дополнительной информации и без фактического сообщения об ошибке.
Легко, объявите ссылку окончательной, и это будет видно по коду класса anon.