【问题标题】:ActionPerfomed Method not working in Inner ClassActionPerfomed 方法在内部类中不起作用
【发布时间】:2013-07-13 09:15:43
【问题描述】:

我是一个初学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 的一个实例。

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

【问题讨论】:

标签: java swing jframe actionlistener inner-classes


【解决方案1】:

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

static class  Innerclass implements ActionListener

【讨论】:

  • 是的,它解决了我的问题,请解释一下“否则将为封闭类的每个实例创建一个新类(不是实例):”
  • Ejaaaactly,这样啊,现在学C#了,搞糊涂了,什么语言,内部类默认是静态的。这个答案确实刷新了我的记忆:-) +1,尽管我的投票将在 10 小时内出现:(
【解决方案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();
            }
        });
    }
}

【讨论】:

  • 这种方式存在问题,如果我将框架等放入构造函数中,我无法将我的类的实例 (InnerClasses innerClasses = new innerClasses();) 传递给 frame.add(innerClasses)// this给出错误
  • @JavaStudent :就此而言,只需使用frame.add(this),因为您的InnerClasses 扩展了JPanel,因此无需创建InnerClasses 的对象,而是使用this 关键字相同的目的:-) +1 答案,将在 10 小时内出现 :(
最近更新 更多