2011-01-20 4 views
1

Как передать объект в реализацию и передать локальный объект объекту, который находится снаружи? Я думаю, что 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 типа (например, x.new 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); 
    } 
} 

sourcecode в

+1

является «GUIthread» локальным внутренним классом или является отдельным? –

+0

отредактирован, извините за путаницу! – wizztjh

ответ

2

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

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

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

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

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

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

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

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

+0

любая сторона вниз, используя статический класс для вызова swing? Итак, все экземпляры происходят внутри Outer constructor? правильно? – wizztjh

0

Попробуйте

final Sensors sens = new Sensors(); 

вместо этого.

+0

, но окончательные средства не могут быть изменены, у меня есть поток, который работает для изменения значения внутри объекта Sensors. – wizztjh

+0

@wizztjh - см. Мой комментарий на ответ @Alice Young. Это не ваша непосредственная проблема. –

+0

вы можете передать мне ссылку, она не показывает имя человека, который спрашивает в профиле SO ... – wizztjh

0

Легко, объявите ссылочный окончательный, и он будет отображаться кодом класса анонов.

+0

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

0

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

Смежные вопросы