KeyListener NullPointerAcception в моем пользовательском интерфейсе, почему JTextField.setText (""); не работает? - PullRequest
0 голосов
/ 10 апреля 2019

Я пытался сделать эту текстовую игру, в которой у пользователя есть пользовательский интерфейс, в котором они просто вводят команды в JTextField, а игра разворачивается в JTextArea.Классическая RPG своего рода стиль.У меня были проблемы с использованием KeyListener, чтобы попытаться увидеть, когда пользователь нажимает клавишу «ввод», которая помещает то, что они сказали, в JTextArea, а затем очищает JTextField.Это работало прежде, чем без проблем, JTextField очистится, и все было идеально.Затем после того, как я попытался добавить JTextArea.append (текст);к смеси все сломалось.Даже после удаления функции теперь возникнет та же ошибка:

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 и установить его во временную строку, текст, затем стереть JTextField и добавить текст в JTextArea.Конечно, этого не произошло, и все, что я получил взамен, это ошибка NullPointerException.Любая помощь будет принята с благодарностью.Этот код был бельмом на моей стороне целую вечность.

1 Ответ

2 голосов
/ 10 апреля 2019
input.setText("");

Эта строка вызывает ошибку, поскольку вы еще не инициализировали input значением.

Обратите внимание, что у вас есть две переменные с одинаковым именем.В вашем классе у вас есть поле, объявленное как:

private JTextArea input;

, а в конструкторе у вас есть:

JTextField input=new JTextField("");

Поскольку это локальная переменная в конструкторе, она недоступнак другим методам.Измените эту строку на

input=new JTextField("");
...