ActionPerformed方法不在Inner Class中工作

时间:2013-07-15 13:27:54

标签: java swing jframe actionlistener inner-classes

我是初学java程序员,试图通过Inner类实现ActionListener。下面是一个简单的代码,我想在按钮点击时更改标签文本,而不是使用getSource我想要使用内部类的多个组件。这是我的代码:

public class InnerClasses extends JPanel  { 

    static   JFrame frame ;     
    static JButton button ; 
    static  JLabel   label  ; 
    public static void main(String[] args) {    
        InnerClasses i=  new InnerClasses();    
        frame= new JFrame("Inner class");
        frame.setSize(400,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
        frame.add(i);
        label = new JLabel(BorderLayout.NORTH);
        label.setText("I m label");
        i.add(label);    
        button = new JButton(BorderLayout.SOUTH);
        button.setText("Click me ");
        button.addActionListener(new  innerclass() );
        i.add(button);
        frame.setVisible(true);
    }

    class  innerclass implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {    
            label.setText("i have been changed");
        }    
    }

现在当我尝试将监听器注册到按钮时,它会给出错误

  

无法访问类型为InnerClasses的封闭实例。必须符合资格   使用InnerClasses类型的封闭实例进行分配(例如   x.new A()其中x是InnerClasses的一个实例。)

如果我正在做一些非常复杂的语法或者这里有什么错误,请帮助我

2 个答案:

答案 0 :(得分:3)

您的内部类不是静态的,因此您无法从静态方法实例化它,并且通常,最好将内部类定义为静态,否则将为每个实例创建一个新类(而不是实例)。附上课程:

static class  Innerclass implements ActionListener

答案 1 :(得分:2)

  • 创建任何需要某种层次结构的GUI,基于Oracle tutorials和良好的实践,代码排序可能很重要

  • 不要在主要方法

  • 中创建任何Swing GUI对象
  • 我找不到任何理由在Java

  • 中声明任何静态内容

例如

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class InnerClasses {

    private JFrame frame;
    private JPanel panel;
    private JButton button;
    private JLabel label;

    public InnerClasses() {
        label = new JLabel();
        label.setText("I m label");
        button = new JButton();
        button.setText("Click me ");
        button.addActionListener(new MyActioListener());
        panel = new JPanel();
        panel.add(label);
        panel.add(button);
        frame = new JFrame("Inner class");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }

    class MyActioListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            label.setText("i have been changed");
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                InnerClasses innerClasses = new InnerClasses();
            }
        });
    }
}