我是初学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的一个实例。)
如果我正在做一些非常复杂的语法或者这里有什么错误,请帮助我
答案 0 :(得分:3)
您的内部类不是静态的,因此您无法从静态方法实例化它,并且通常,最好将内部类定义为静态,否则将为每个实例创建一个新类(而不是实例)。附上课程:
static class Innerclass implements ActionListener
答案 1 :(得分:2)
创建任何需要某种层次结构的GUI,基于Oracle tutorials和良好的实践,代码排序可能很重要
不要在主要方法
我找不到任何理由在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();
}
});
}
}