2011-04-25 42 views
1

我剛開始學習java,我遇到了一些靜態/非靜態的問題。我的代碼的問題在actionlistener之內。當我嘗試編譯它時,它說:什麼使這個上下文是靜態的?那該怎麼辦?

非靜態方法不能從靜態上下文中引用。

我是否認爲所執行的動作是靜態的?如果是這樣,我怎樣才能使用actionlistener來執行一個方法? (我清楚地知道,我可能只是把文字在我的代碼,爲actionlistener,但如果我有不同的情況......)

public class But extends JFrame{ 
    public void test(){ 
     //A method 
     System.out.println("Testing"); 
    } 
} 

class TestListener implements ActionListener{ 
    public TestListener(){} 
    public void actionPerformed(ActionEvent e) { 
     But.test(); 
}} 

回答

2

Buttest()是一個實例方法(非靜態),但你正試圖訪問它,就像它是靜態的。

嘗試

class TestListener implements ActionListener{ 
    private But but = new But(); 
    public TestListener(){} 
    public void actionPerformed(ActionEvent e) { 
     but.test(); 
}} 

,或者如果您打算做test(),改變它的簽名,以

public static void test(){ 
+0

雖然可以編譯,但這可能不會調用OP所打算的「But」實例。 – 2011-04-25 22:45:18

1

TestListener需要知道呼籲.test()方法的按鈕。因此,嘗試:

class TestListener implements ActionListener { 
    private final But but; 
    public TestListener(But b) { 
     but = b; // save the instance of But that we want to call 
    } 
    public void actionPerformed(ActionEvent e) { 
     but.test(); 
    } 
} 

這改變了TestListener構造採取But並將其存儲在but領域走在內部的一個實例。然後,在執行操作時,可以調用.test()方法。

您需要適當修改對TestListener構造函數的調用。

0
But.test(); 

您需要創建「But」類的實例。你在這裏調用它的方式就好像它是一個靜態(類)方法,而不是一個非靜態(實例)方法。

也許只是一個錯字。