当前位置: 首页 > 知识库问答 >
问题:

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

司寇光华
2023-03-14

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

NameLabel.setText(“Name Changed”);

行。我想提到的是,如果我在Something类中创建这个listener类,就会工作得很好。我不知道为什么抛出null异常,因为标签是先初始化的,然后按钮只想改变文本。我尝试创建一个getFunction,调用那个标签,尝试使用object Something,使用object 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();
    }
}

listener类

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

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

我该如何解决这个问题呢?

共有1个答案

卢英叡
2023-03-14

问题是,因为changelabel类扩展了something,所以它将包含自己的changeName变量,该变量未初始化为==null

您可以:

  1. 使ChangeLabel实现成为某些东西的私有类(良好做法)或
  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");
    }
}
 类似资料:
  • 据我所知,在Java11中,这两个操作可以在一行中完成,不是吗?

  • 下午好: 我最近创建了一个类“X”,它包含一个单一属性“network”,定义为一个映射,使用字符串作为键,另一个映射作为值(double map)。对于此类,将使用“hashmap”实现。 该类大致如下所示: 但是,当我执行函数中包含的network.put指令时,编译器会自动检测到一个错误:“表达式预期”。如果可能,我想知道在向映射中添加新的键值元素时是否使用了错误的语法,或者是否是映射的初始

  • 同一类型的扫描仪方法在一个地方工作,但在另一个地方不工作。。。如果这改变了任何答案,我将使用eclipse作为我的代码编辑器。如果不是在这里,所有变量都已在别处声明。 如果有人知道如何解决这个问题,我将永远感激你:) 这一个正在工作: 这个不起作用: 错误消息:

  • 为什么我不能这样做? 我得到: 致命错误:常量表达式包含无效操作 这有什么办法吗?

  • 问题内容: 我在用Java工作。 我通常会这样设置一些对象: 问题是:在此示例中是否等于,按原样我可以假定对未初始化的对象进行空检查将是准确的? 问题答案: 正确,未显式初始化的引用类型的静态成员和实例成员都由Java 设置为。相同的规则适用于数组成员。 根据Java语言规范的第4.12.5节: 变量的初始值 程序中的每个变量在使用值之前都必须具有一个值: 每个类变量,实例变量或数组组件在创建时均

  • 以下是MyService应用程序: 我已经指定了@AllargsConstructor。当我试图为上面的类编写单元测试时,它失败了。以下是我如何编写单元测试: 抛出的错误是: Java:类中的构造函数MyService不能应用于给定类型;必填:未找到参数:原因:实际参数列表和正式参数列表的长度不同 但当我在MyService中显式定义构造函数时,测试就会通过。这里有人能帮我吗?