2

我是一个初学者java程序员,试图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 类型的封闭实例来限定分配(例如 xnew A(),其中 x 是 InnerClasses 的实例)。

如果我在做一些违反语法的事情或这里有什么问题,请帮助我

4

2 回答 2

3

你的内部类不是静态的,所以你不能从静态方法中实例化它,一般来说,最好将内部类定义为静态的,否则将为封闭类的每个实例创建一个新类(不是实例):

static class  Innerclass implements ActionListener
于 2013-07-15T13:37:07.703 回答
2
  • 创建任何 GUI 都需要一些层次结构,基于Oracle 教程和良好实践,代码排序可能很重要

  • 不要在主要方法中创建任何 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();
            }
        });
    }
}
于 2013-07-15T13:51:08.610 回答