Использование KeyEvents с Java.awt - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь создать текстовую игру и решил, что лучший способ сделать это - использовать пользовательский интерфейс вместо метода cin.nextLine () и вывод компилятора.То, что я пытался сделать, это добавить KeyEvent в мой TextField для ввода данных пользователем, где, когда пользователь нажимает клавишу ввода, его текст попадает в область TextArea, которую я установил выше, под любым другим текстом, и ввод исчезает.Я также пытался добавить строку, введенную ими, во ввод непосредственно перед нажатием клавиши ввода в строковую переменную, которая будет обработана позже в операторах if / else.

Я попытался добавить текстmain.input.setText ( "");но это тоже не сработало.Кроме того, я пытался добавить слово public до замедления и инициализации TextField, но это привело к его собственной ошибке. Я также точно не знаю, как мне правильно обращаться к тексту внутри TextField, чтобыдобавьте его в TextArea выше и обработайте как строковую переменную.

import java.awt.*;
import java.awt.event.*;

public class UI extends Frame implements KeyListener
{
    public void test()
    {
        Frame main=new Frame();
        main.setSize(1366,768);
        main.setLayout(null);
        main.setVisible(true);
        TextArea mainText=new TextArea("Come on and do something!");
        mainText.setBounds(10,30,1366,728);
        main.setBackground(Color.white);
        mainText.setEditable(false);
        TextField input=new TextField("");
        input.setBounds(10,738,1366,20);
        main.add(input);
        main.add(mainText);
        input.addKeyListener(this);
    }
    public void keyTyped(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}
    public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_ENTER) {
        Toolkit.getDefaultToolkit().beep();
        input.setText("");
    }
}

    public static void main(String[] args)
    {
        UI set = new UI();
        set.test();
    }
}

Я ожидал, что этот код установит пустое значение TextField, и я надеялся пойти дальше, чтобы узнать, как добавить кодк переменной и к текстовой области.Вместо этого я получаю это сообщение об ошибке:

Error: cannot find symbol
  symbol:   variable input
  location: class UI

РЕДАКТИРОВАТЬ: Хорошо, я не знал, что AWT устарел, поэтому я изменил его на версию Swing.Я также удалил расширение, а также изменил KeyListener на ActionListener.Однако в настоящее время происходит то, что ActionListener не добавляется должным образом в JTextField.Вот мой обновленный код ниже:

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

public class UI
{
    private JFrame main;
    private JTextArea mainText;
    public UI()
    {
        main=new JFrame("Text Game");
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        main.setSize(1366,768);
        mainText=new JTextArea("Come on and do something!");
        mainText.setBounds(10,100,1366,728);
        mainText.setEditable(false);
        JTextField input=new JTextField("");
        input.setBounds(10,700,1366,20);
        input.addActionListener(this);
        main.add(input);
        main.add(mainText);
        main.setVisible(true);
    }

        public static void main(String[] args)
        {
            new UI();
        }
}

Есть идеи, что я сейчас сделал неправильно?

1 Ответ

0 голосов
/ 20 декабря 2018

Основная проблема связана с контекстом.input объявлен как локальная переменная в контексте конструктора, поэтому к нему нельзя получить доступ из любого другого контекста

 public void test()
    {
        //...
        TextField input=new TextField("");
        //...
    }

Если честно, это довольно простая Java 101, вы должны начать свзглянуть на Понимание членов класса .Эту концепцию вы должны понять, прежде чем приступить к разработке графического интерфейса (IMHO)

Наблюдения

  • Избегайте KeyListener (в целом), особенно с текстовыми компонентами
  • Используйте ActionListener вместо
  • AWT устарел, подумайте о Swing или, что еще лучше, JavaFX
  • Избегайте null макетов, они будут тратить ваше время
  • Как правило, вы не должны расширяться непосредственно из контейнеров верхнего уровня, таких как Frame.Они запирают вас в единый сценарий использования, снижают возможность повторного использования, и вы все равно не добавляете в класс никаких новых функциональных возможностей
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...