【发布时间】: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