如何将对象传递给工具并传递出本地对象?

时间:2011-01-20 04:13:30

标签: java oop swing object implements

如何将对象传递给工具并将本地对象传递给外部的对象?我认为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

4 个答案:

答案 0 :(得分: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
    

<强>后续

  

任何使用静态类调用swing的内线?

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

  

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

没有。上面“限定创建”示例中的代码可以出现在Inner类可访问的任何位置。因为我们宣布它为public ...

如果在Inner的构造函数(或实例方法)中实例化Outer,则可以使用new Inner()。封闭的Outer实例与this相同。

答案 1 :(得分:0)

尝试

final Sensors sens = new Sensors();

代替。

答案 2 :(得分:0)

简单,声明参考最终,它将由匿名类代码看到。

答案 3 :(得分:0)

我同意Zach并怀疑GUIthread是一个内部类。如果是这样,你可能会把它变成一个独立的类或一个静态的内部类,但是如果没有更多信息且没有实际的错误信息,很难知道这是否是真正的解决方案。