java - 我的 UI 中的 KeyListener NullPointerAcception,为什么是 JTextField.setText(""); 不工作?
问题描述
我一直在尝试制作这个文本游戏,其中用户有一个用户界面,他们只需在 JTextField 中输入命令,游戏就会在 JTextArea 中播放。经典的 RPG 风格。我一直在使用 KeyListener 来尝试查看用户何时按下“enter”键,该键将他们所说的内容放入 JTextArea,然后清除 JTextField。它之前没有问题,JTextField 会清除,一切都很完美。然后在我尝试添加 JTextArea.append(text); 混合在一起,一切都破裂了。即使把它拿走,这个函数现在也会出现同样的错误:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at UITest.keyReleased(UITest.java:17)
正如我之前所说,我已经尝试将其移回原始状态,但这不起作用。我还查找了这个问题,有人说我需要添加一个 KeyEvent.consume(); 所以我也试过了,但它什么也没做。同样的错误继续发生。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class UITest implements KeyListener{
private JFrame main;
private JTextArea mainText;
private JTextArea input;
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()== KeyEvent.VK_ENTER) {
e.consume();
System.out.println("pressed");
String text = input.getText();
input.setText("");
mainText.append(text);
}
}
public void keyTyped(KeyEvent e) {}
public void actionPerformed(ActionEvent e) {}
public UITest(){
main=new JFrame("Text Game");
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
main.setSize(1366,768);
mainText=new JTextArea("Testing");
mainText.setBounds(10,100,1366,728);
mainText.setEditable(false);
JTextField input=new JTextField("");
input.setBounds(10,700,1366,20);
input.addKeyListener(this);
main.add(input);
main.add(mainText);
main.pack();
main.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new UITest();
}
});
}
}
我希望这只是从 JTextField 获取文本并将其设置为临时字符串 text,然后擦除 JTextField 并将文本添加到 JTextArea。当然,这并没有发生,我得到的只是 NullPointerException 错误。任何帮助将不胜感激。这段代码多年来一直是我的眼中钉。
解决方案
input.setText("");
这是导致错误的行,因为您尚未初始化input
为值。
请注意,您有两个具有相同名称的变量。在您的班级中,您有一个字段声明为:
private JTextArea input;
在构造函数中你有:
JTextField input=new JTextField("");
由于 this 是构造函数中的局部变量,因此对其他方法不可用。将此行更改为
input=new JTextField("");
推荐阅读
- javascript - 在 div 外部单击时关闭 div 在 iPhone 上不起作用。在 Mac/PC 和 Android 上运行良好
- c# - Dotnet Core 默认使用哪个 appsettings.json 文件,环境文件还是父文件?
- ios - 没有故事板使用时,具有渐变背景的 UISlider 不起作用
- regex - Nginx 正则表达式重写规则不起作用
- android - 如何强制专注于android编辑文本
- javascript - 带占位符的正则表达式
- cassandra - 仅使用分区键的查询性能
- javascript - 未定义不是对象(UIConstants)
- javascript - 使用 python 抓取 javascript:void(0) 内容
- javascript - 如何在不向第一个对象添加额外字段的情况下将具有更多字段的对象分配给具有较少字段的另一个对象?