2011-10-20 86 views
2

我想使用內部類的設置,但是我遇到了一些問題。這是代碼我試圖使用方法:使用內部類的問題(java)

public class GUI 
{ 
    class ButtonHandler implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
     // do something 
     } 
    } 

    private static void someMethod() 
    { 
     JButton button = new JButton("Foo"); 
     button.addActionListener(new ButtonHandler()); 
    } 
} 

這是錯誤消息我得到(在eclipse):

No enclosing instance of type GUI is accessible. Must qualify the allocation with an enclosing instance of type GUI (e.g. x.new A() where x is an 
instance of GUI). 

請有人可以幫我嗎?

+0

這是一個奇怪的例子。通常當你這樣做一個監聽器時,你希望它有權訪問外部類實例。而按鈕等組件必須存在於另一個組件中。使用靜態方法沒有多大意義。所以儘管每個人都在告訴你讓你的內部類是靜態的,你可能會遇到更大的問題。查看Oracle Swing教程,瞭解如何製作Swing GUI的示例。 –

+0

可能有[Java的重複 - 沒有可以訪問Foo類型的封閉實例](http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – fabian

回答

8

更改聲明來源:

class ButtonHandler implements ActionListener 

要:

static class ButtonHandler implements ActionListener 

沒有「靜態」修飾符,它是一個實例級的內部類,這意味着你需要封閉GUI的一個實例它的工作類。如果你把它變成一個「靜態」的內部類,它就像一個普通的頂級類(它是隱式靜態的)。

(而關鍵原因,這是你的榜樣必要的是,someMethod是靜態的,所以你有沒有在這方面的封閉類的實例。)

1

讓你的內部類是靜態的。 :)

2

我相信這是給你這個錯誤,因爲這是一個靜態方法正在做。由於ButtonHandler是一個非靜態嵌套類,因此它必須綁定到一個封閉的GUI實例。最有可能你只是想,而不是一個靜態的嵌套類:

static class ButtonHandler implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     // do something 
    } 
} 
1

要,你需要有周圍的外部類的一個實例創建非靜態內部類的一個實例(並且沒有,因爲someMethod是靜態):

JButton button = new JButton("Foo"); 
button.addActionListener(new GUI().new ButtonHandler()); 

如果沒有必要的內部類訪問外部類的成員/方法,使內部類靜態的,那麼你可以創建一個這樣的內部類的一個實例:

static class ButtonHandler implements ActionListener { ... } 

... 

JButton button = new JButton("Foo"); 
button.addActionListener(new GUI.ButtonHandler()); 

(在這種情況下,甚至普通的new ButtonHandler()會的工作,因爲someMethod()在外部類GUI,即在同一個「命名」爲ButtonHandler定義)

0

你正試圖從一個靜態成員中訪問一個非靜態成員。當您在靜態函數內部訪問ButtonHandler時,成員類不可見,因爲它與GUI類的實例關聯。

0

你應該ButtonHandler靜態類。例如:

static class ButtonHandler implements ActionListener 

在Java中,static內部類不需要容器類的實例來實例化。你可以簡單地做new ButtonHandler()(就像你現在正在做的那樣)。

只是爲了您的信息,你也可以改變線

button.addActionListener(new ButtonHandler()); 

button.addActionListener(this.new ButtonHandler()); 

但我不會推薦它。