【问题标题】:Unseen initialized objects in another class in JavaJava中另一个类中看不见的初始化对象
【发布时间】:2015-05-17 03:33:21
【问题描述】:

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

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

线。我想提一下,如果我在Something 类中创建这个监听器类,那么它工作得很好。 我不知道为什么会抛出空异常,因为标签首先被初始化,然后按钮只想更改文本。 我尝试创建一个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");
    }
}

我该如何解决这个问题?

【问题讨论】:

  • 请重新格式化您的问题。

标签: java


【解决方案1】:

问题在于,因为changeLabel 类扩展了Something,它将包含它自己的未初始化的changeName 变量== null

你可以:

  1. changeLabel 实现设为 Something 的私有类(良好做法)或
  2. JLabel 传递给它的构造函数。

changeLabel 在这两种情况下都不应扩展Something

代码示例 #1:

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");
        }
    }
}

代码示例 #2:

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

public class changeLabel implements ActionListener {
    private final JLabel label;

    public changeLabel(JLabel label) {
        this.label = label;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        label.setText("Andrei");
    }
}

【讨论】:

  • 我用同样的方法,有嵌套类,但是我的老师告诉我有一个带有监听器类的包,一个带有计算部分的包..我开发了一个应用程序..我拥有一切在一个类中,其余类是嵌套的。但他们告诉我这不是一个好方法,如果你愿意,我需要将所有内容分开以易于阅读并易于修改代码中的某些内容。如果没有扩展,我该怎么做才能使这成为可能?
猜你喜欢
  • 2016-12-18
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2014-11-09
  • 2016-01-08
相关资源
最近更新 更多