我一直在尝试制作这种文本游戏,其中用户具有一个UI,他们只需在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中获取文本并将其设置为临时String文本,然后擦除JTextField并将文本添加至JTextArea。当然,这没有发生,而我得到的只是NullPointerException错误。任何帮助将不胜感激。多年来,这段代码一直困扰着我。
答案 0 :(得分:2)
input.setText("");
这是导致错误的行,因为您尚未将input
初始化为值。
请注意,您有两个具有相同名称的变量。在您的课程中,您有一个字段声明为:
private JTextArea input;
,在构造函数中,您可以:
JTextField input=new JTextField("");
由于这是构造函数中的局部变量,因此它不适用于其他方法。将此行更改为
input=new JTextField("");