2011-01-20 31 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是一個內部類。如果是這樣,你可能會做得很好,使它成爲一個獨立的類或靜態的內部類,但很難知道這是否是沒有更多信息且沒有實際錯誤信息的真正解決方案。