2011-04-25 40 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”类的实例。你在这里调用它的方式就好像它是一个静态(类)方法,而不是一个非静态(实例)方法。

也许只是一个错字。