2011-01-20 33 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`一个本地的内部类,还是单独的?编辑 – 2011-01-20 04:21:19

+0

,抱歉让人混淆! – wizztjh 2011-01-20 05:01:07

回答

2

当您尝试在未指定(或暗示)封闭类的实例的上下文中创建非静态内部类的实例时,会出现此问题。

从这里我推断出你已​​经把你的一个类声明为一个非静态的内部类;例如是这样的:

public class Outer { 
    ... 
    public class Inner { 
     public Inner() { 
      ... 
     } 
     ... 
    } 
    ... 
} 

如果现在尝试使用new Inner()一些其他的代码创建的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 ...

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

0

尝试

final Sensors sens = new Sensors(); 

代替。

+0

但最后的手段不能改变,我有一个线程运行,以改变传感器对象内的值。 – wizztjh 2011-01-20 04:53:54

+0

@wizztjh - 请参阅我对@Alice Young的回答的评论。这不是你的直接问题。 – 2011-01-20 05:07:33

0

容易,申报参考决赛,它会被匿名类代码看到。

0

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