【问题标题】:Static variable and actionePerformed method?静态变量和actionePerformed方法?
【发布时间】:2018-03-06 05:07:21
【问题描述】:

我有一个名为 Windows 的课程。该类扩展了 JFrame 并将 GUI 组件添加到 JFrame 容器中。其中一个组件是 JTextfield。当单击生成器 JButton 时,我试图通过 actionPerformed() 在 JTextfield 中设置文本。 actionPerformed() 是一个名为 EvenHandler 的类。这是事件处理程序:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;


public class EventHandler implements ActionListener {
    int x = 0;
    PassWordGenerator password;
    Window Window; // It works only when static Window Window.

    public void start() {
         Window = new Window();
    }


    @Override
    public void actionPerformed(ActionEvent e) {
         password = new PassWordGenerator(3,3,3,3);
         Window.setGeneratedPswd(password.getPswd());
         x += 1;
         System.out.println(x);
    }

    public static void main(String[] args) {
        EventHandler x = new EventHandler();
        x.start();
    }
}

如果您想了解 GUI 的外观,请使用窗口类。该按钮是调用 actionePerfome() 的按钮。

import javax.swing.*;
import java.awt.*;

public class Window extends JFrame  {
    Label passwordLength;
    Label labelGnPswd;
    JTextField psdLength;
    JCheckBox upperCase_letters;
    JCheckBox lowerCase_letters;
    JCheckBox numbers;
    JCheckBox symbols;
    JTextField generatedPswd;
    EventHandler event = new EventHandler();
    JButton generetor;

    public Window() {
        setLayout(new FlowLayout());
        setTitle("PasswordGenerator");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);

        //Password Length
        passwordLength = new Label("Password Length");
        add(passwordLength);

        //Input text
        psdLength = new JTextField("0", 5);
        add(psdLength);

        //Create checkBoxes
        createcheckbxs();

        //Label Generated psw
        labelGnPswd = new Label("Generated pswd");
        add(labelGnPswd);

        //Generated Password;
        generatedPswd = new JTextField("****", 5);
        generatedPswd.setEditable(false);
        add(generatedPswd);

        //Button
        generetor = new JButton("Generate pswd!");
        generetor.addActionListener(event);
        add(generetor);

        setSize(200, 400);
        setVisible(true);

    }

    public String getpsdLength() {
        return psdLength.getText();
    }

    public void setGeneratedPswd(String pswd) {
        generatedPswd.setText(pswd);
    }

    private void createcheckbxs() {
        upperCase_letters = new JCheckBox("Include uppercase");
        add(upperCase_letters);

        lowerCase_letters = new JCheckBox("Include lowercase");
        add(lowerCase_letters);

        numbers = new JCheckBox("Include numbers ");
        add(numbers);

        symbols = new JCheckBox("Include symbols ");
        add(symbols);
    }

}

我的问题是,当我单击生成器 JButton 时,我收到一条错误消息,“线程中的异常“AWT-EventQueue-0”java.lang.NullPointerException...”我调试了 actionPerformed() 和我发现单击生成器 Jbutton 后调用 actionPefromed() 时,Window Window 为空。为什么窗口为空? Int x 工作正常,它不为空。 var x 和 window 不是同一个可变范围。我可以保持 Window 的值不为 null 的唯一方法是使 Window 成为静态变量。我希望我的问题更清楚一点。提前致谢

【问题讨论】:

  • 不清楚为什么你认为它必须是static。请澄清您的问题。
  • 当你有一个名为Window 的类时,Window 是一个糟糕的字段名称。为什么不遵循 Java 代码约定?
  • 你的类名和对象名是一样的static Window Window;这是怎么工作的?
  • 你确定你在打电话给actionPerformed之前打电话给start()吗?
  • 所以我编辑了我的问题,我想知道现在的信息是否足以让我的问题暂时搁置。

标签: java static-methods event-driven


【解决方案1】:

您的问题似乎在Window.java 的这一行中:

generetor.addActionListener(event);

变量eventWindow.java中声明:

EventHandler event = new EventHandler();

问题是event start() 没有被调用,所以它的实例变量Window Window 仍然是null。不使用您在 main() 中实例化的 EventHandler。你可能会做的是删除你的start 方法并将其内容放入构造函数中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多