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 类型的封闭实例来限定分配(例如 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

4 回答 4

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
    

跟进

使用静态类调用摇摆有什么缺点吗?

只有我在上面确定的那个。

那么,所有的实例化都发生在外部构造函数中吗?对?

不可以。上面“合格创建”示例中的代码可以出现在Inner类可访问的任何位置。既然我们宣布它为public...

如果您Inner在构造函数(或实例方法)中实例化Outer,您可以只使用new Inner(). 封闭Outer实例与this.

于 2011-01-20T04:41:57.303 回答
0

尝试

final Sensors sens = new Sensors();

反而。

于 2011-01-20T04:17:14.260 回答
0

很简单,将引用声明为final,匿名类代码将看到它。

于 2011-01-20T04:38:55.047 回答
0

我同意 Zach 并怀疑 GUIthread 是一个内部类。如果是这样,您最好将其设为独立类或静态内部类,但如果没有更多信息和实际错误消息,很难知道这是否是真正的解决方案。

于 2011-01-20T04:43:31.550 回答