2013-07-19 41 views
1

我一直在努力解决我的代码几个小时,我仍然无法摆脱这个错误。在下面的代码中,One.addActionListener(this)Two.addActionListener(this)都在this的下方有红线,表示'不能在静态上下文中使用它'。如果可以,请帮助我。谢谢!Java中的ActionListener问题

import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.awt.event.WindowEvent; 
    import java.awt.event.WindowListener;  
    import javax.swing.JButton; 
    import javax.swing.JFrame; 

    public class TheMain extends JFrame implements ActionListener, WindowListener { 

     int input1 = 0; 
     int input2 = 0; 

     public static void main(String[] args) { 
      TheMain main = new TheMain(); 
      JButton One = new JButton("1"); 
      One.setSize(10, 10); 
      One.addActionListener(this);  
      JButton Two = new JButton("2"); 
      Two.setSize(10, 10); 
      Two.addActionListener(this);  
    } 

    public TheMain(){ 
    JButton One = new JButton("1"); 
    One.setSize(10, 10); 
    One.addActionListener(this);    

    JButton Two = new JButton("2"); 
    Two.setSize(10, 10); 
    Two.addActionListener(this);   

    JFrame frame = new JFrame("window"); 
    frame.setSize(200, 250); 
    frame.setVisible(true); 
    frame.add(One); 
    frame.add(Two); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if(input1 != 0){ 
      if(input2 != 0){ 
       System.out.println("Max 2 numbers!"); 
      }else{ 
       input2 = 1; 
      } 
     }else{ 
      input1 = 1; 
     }   
    } 

    public void actionPerformed1(ActionEvent e) { 
     if(input1 != 0){ 
      if(input2 != 0){ 
       System.out.println("Max 2 numbers!"); 
      }else{ 
       input2 = 2; 
      } 
     }else{ 
      input1 = 2; 
     }   
    } 

    @Override 
    public void windowOpened(WindowEvent e) { 
     // TODO Auto-generated method stub  
    } 

    @Override 
    public void windowClosing(WindowEvent e) { 
     // TODO Auto-generated method stub  
    } 

    @Override 
    public void windowClosed(WindowEvent e) { 
     // TODO Auto-generated method stub  
    } 

    @Override 
    public void windowIconified(WindowEvent e) { 
     // TODO Auto-generated method stub  
    } 

    @Override 
    public void windowDeiconified(WindowEvent e) { 
     // TODO Auto-generated method stub  
    } 

    @Override 
    public void windowActivated(WindowEvent e) { 
     // TODO Auto-generated method stub  
    } 

    @Override 
    public void windowDeactivated(WindowEvent e) { 
     // TODO Auto-generated method stub  
    }  
} 
+3

了解更多关于面向对象的编程。 'this'必须指向静态上下文中没有实例的当前类的实例。 –

+1

只需在''this'处写'main'来代替'this',因为您已经在'main'方法内引用了该类:-) –

+1

您已经在构造函数中创建按钮,那么为什么要再次创建它们?你的类扩展了JFrame,所以你为什么要创建一个新的JFrame来添加按钮? – ChadNC

回答

3

在你可以只使用静态变量或局部变量的静态方法,你可以不使用实例变量,并且this代表TheMain实例,因此您不能在main方法中使用它,即static。你应该改变

addActionListener(this); 

addActionListener(main); 
+0

谢谢,当我运行这个时,只有一个大的2个按钮,但没有1个按钮。你知道我该如何解决这个问题吗? – Cj1m

+0

@ user1952565这是由于布局经理。阅读[如何使用布局管理器](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html) – BackSlash

+0

好吧,我已经解决了,但一个和两个按钮都与同一个actionlister ,我该如何解决这个问题? – Cj1m

4

你不能在一个static方法使用this(你的情况main法)。因为,this表示当前实例该方法正在执行。

由于static方法是这样的方法,可以调用没有实例,this并不总是有意义的。所以Java提供了编译错误Cannot use this in a static context

你应该更改您的代码

One.addActionListener(main); 

由于main是一个已经创建的实例

+0

谢谢,当我运行这个时,只有一个大的2个按钮,但没有1个按钮。你知道我该如何解决这个问题吗? – Cj1m

+0

@ user1952565:'JFrame'的默认布局是'BorderLayout',所以当你编写'frame.add(One)'时,它在内部被视为'frame.add(One,BorderLayout.CENTER)',因此你添加了两个组件在同一位置,这是不可能的,因为在任何给定的时间只有一个组件可以被添加到任何位置。所以试试这个'frame.add(One,BorderLayout.PAGE_START);和frame.add(两个,BorderLayout.PAGE_END);'然后'frame.pack(),然后是frame.setVisible(true)'。阅读[LayoutManagers](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html) –

+0

好的,谢谢我已经解决了,但一个和两个按钮都是同一个actionlister,如何可以我解决这个问题? – Cj1m