在Java中看不到另一个类中的初始化对象

时间:2015-03-14 18:45:03

标签: java

简而言之,我创建了一个类Something女巫有一个JFrame函数,我有一个标签和一个按钮。在按钮上我有一个addActionListener(new changeLabel())。 我在src包中为侦听器做了类changeLabel,但是当我启动应用程序并单击按钮时,在changeLabel上抛出NullPointerException

  

nameLabel.setText("名称已更改");

线。我想提一下,如果我在Something类中创建这个监听器类,那就完美了。 我不知道为什么抛出null异常,因为标签首先被初始化,然后按钮只想更改文本。 我试着制作一个getFunction,调用那个标签,我尝试使用对象Something,对象changeLabel等......但是没有用。 这是一些代码

package trying;

import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.event.*;

public class Something {

    JFrame frame;
    JLabel changeName;
    JButton button;
    public void gui(){
        frame = new JFrame();
        frame.setSize(200, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //is just an example

        changeName = new JLabel("Stefan");
        //is just an example

        button = new JButton("Change");
        button.addActionListener(new changeLabel());
        frame.getContentPane().add(changeName, BorderLayout.NORTH);
        frame.getContentPane().add(button, BorderLayout.SOUTH);
        frame.setVisible(true);
    }

    public static void main(String args[]){
        new Something().gui();
    }
}

听众类

package trying;
import java.awt.event.*;

public class changeLabel extends Something implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        changeName.setText("Andrei");
    }
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题是因为changeLabel类扩展了Something,它将包含它自己的changeName变量,该变量未初始化== {{1} }。

你可以:

  1. 使null实现私有类Something(良好实践)或
  2. changeLabel传递给其构造函数。
  3. JLabel两种方式都不应延伸changeLabel

    代码示例#1:

    Something

    代码示例#2:

    public class Something {
    
        JFrame frame;
        JLabel changeName;
        JButton button;
        public void gui(){
            frame = new JFrame();
            frame.setSize(200, 200);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //is just an example
    
            changeName = new JLabel("Stefan");
            //is just an example
    
            frame.getContentPane().add(changeName, BorderLayout.NORTH);
    
            button = new JButton("Change");
            button.addActionListener(new changeLabel());
            frame.getContentPane().add(button, BorderLayout.SOUTH);
            frame.setVisible(true);
        }
    
        public static void main(String args[]){
            new Something().gui();
        }
    
        class changeLabel implements ActionListener{
            @Override
            public void actionPerformed(ActionEvent e) {
                changeName.setText("Andrei");
            }
        }
    }
    

    public class Something {
        ...
        public void gui() {
            ...
            button.addActionListener(new changeLabel(changeName));
        }
    }