Как установить текст 2d-массива JTextFIelds с помощью actionlistener?

Мое задание состоит в том, чтобы создать 2 панели JPanel, одну для массива 2d, 6 строк из 5 пустых JTextField и другую для JButtons, которые должны чем-то напоминать экранную клавиатуру. Я создал JPanels с пустыми JTextFields и JButtons, теперь мне нужен способ, чтобы, когда я нажимаю JButton с буквой из алфавита, она назначала эту букву первому доступному JTextField в первой доступной строке и перемещала один столбец в время, пока вся строка не будет заполнена буквами (попытка добавить буквы в полную строку ничего не даст). Мне также нужно создать кнопку возврата, которая у меня есть, которая удалит последнюю букву (нажатие возврата на пустую строку ничего не должно делать).

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

public class Wordle extends JFrame implements ActionListener 
{
    private JPanel p1;
    private JPanel p2;
    private JTextField [][] g;

    public Wordle()
    {
        setSize(500,300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        p1 = new JPanel();
        p1.setLayout(new GridLayout(6, 5));
        g=new JTextField [5][6];
        for(int r=0; r<g.length; r++)
        {
            for(int c=0; c<g[r].length; c++)
            {
                g[r][c]= new JTextField();
                getContentPane().add(g[r][c]);
                p1.add(g[r][c]);
            }
        }

        
        p2 = new JPanel();
        p2.setLayout(new GridLayout(4, 7));
        JButton a= new JButton("A");
        a.addActionListener(this);
        p2.add(a);
        JButton b= new JButton("B");
        b.addActionListener(this);
        p2.add(b);
        JButton c= new JButton("C");
        c.addActionListener(this);
        p2.add(c);
        JButton d= new JButton("D");
        d.addActionListener(this);
        p2.add(d);
        JButton e= new JButton("E");
        e.addActionListener(this);
        p2.add(e);
        JButton f= new JButton("F");
        f.addActionListener(this);
        p2.add(f);
        JButton g= new JButton("G");
        g.addActionListener(this);
        p2.add(g);
        JButton h= new JButton("H");
        h.addActionListener(this);
        p2.add(h);
        JButton i= new JButton("I");
        i.addActionListener(this);
        p2.add(i);
        JButton j= new JButton("J");
        j.addActionListener(this);
        p2.add(j);
        JButton k= new JButton("K");
        k.addActionListener(this);
        p2.add(k);
        JButton l= new JButton("L");
        l.addActionListener(this);
        p2.add(l);
        JButton m= new JButton("M");
        m.addActionListener(this);
        p2.add(m);
        JButton n= new JButton("N");
        n.addActionListener(this);
        p2.add(n);
        JButton o= new JButton("O");
        o.addActionListener(this);
        p2.add(o);
        JButton p= new JButton("P");
        p.addActionListener(this);
        p2.add(p);
        JButton q= new JButton("Q");
        q.addActionListener(this);
        p2.add(q);
        JButton r= new JButton("R");
        r.addActionListener(this);
        p2.add(r);
        JButton s= new JButton("S");
        s.addActionListener(this);
        p2.add(s);
        JButton t= new JButton("T");
        t.addActionListener(this);
        p2.add(t);
        JButton u= new JButton("U");
        u.addActionListener(this);
        p2.add(u);
        JButton v= new JButton("V");
        v.addActionListener(this);
        p2.add(v);
        JButton w= new JButton("W");
        w.addActionListener(this);
        p2.add(w);
        JButton x= new JButton("X");
        x.addActionListener(this);
        p2.add(x);
        JButton y= new JButton("Y");
        y.addActionListener(this);
        p2.add(y);
        JButton z= new JButton("Z");
        z.addActionListener(this);
        p2.add(z);
        JButton BackSpace= new JButton("<-");
        BackSpace.addActionListener(this);
        p2.add(BackSpace);
        JButton Enter= new JButton("[");
        Enter.addActionListener(this);
        p2.add(Enter);

        this.getContentPane().add(p1,BorderLayout.NORTH);
        this.getContentPane().add(p2,BorderLayout.SOUTH);
        this.setVisible(true);    
    }

    public void actionPerformed(ActionEvent e) //need help with
    {
        if(e.getSource().equals("A"))
        {
            for(int r=0; r<g.length; r++)
            {
                for(int c=0; c<g[r].length; c++)
                {
                    g[r][c].setText("A");
                }
            }
        } 

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

Это мой код, и моя основная проблема заключается в установке текста в массиве 2d JTextFields с помощью actionlistener, я не против делать каждый цикл if для каждой буквы отдельно, если это имеет смысл и работает так, как я предполагал, кстати если вы еще не заметили, что это игра «Wordle», которую я пытаюсь сделать, я все еще начинающий программист, и все это в новинку для меня, поэтому какое-то интуитивное объяснение было бы очень признательно.

Таким образом, первая выбранная буква должна войти в JTextField в g[0][0], вторая выбранная буква должна войти в g[0][1], а шестая выбранная буква должна войти в g[1][0]. Это правильно? И выбор назад должен удалить последнюю выбранную букву. Это тоже правильно?

Abra 17.05.2022 05:53

Обратите внимание, что эта строка if(e.getSource().equals("A")) не будет работать, потому что e.getSource() возвращает объект, который никогда не будет равен "A". Вместо этого вам нужно сначала привести источник к правильному типу объекта JButton clicked = (JButton)e.getSource();, тогда мы теперь можем получить текст с кнопки, используя use getText() вот так if(clicked.getText().equals("A"))...

sorifiend 17.05.2022 05:56

@Abra Да, в значительной степени, но когда я дохожу до конца строки, она не должна переходить к следующей строке, пока я не нажму JButton для ввода, до которого я еще не добрался, мне просто нужен способ заполнить первую строку теперь.

Brock-ly 17.05.2022 06:02
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
3
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта строка if(e.getSource().equals("A")) — ваш первый выпуск. Это просто не сработает, потому что e.getSource() возвращает объект, который никогда не будет равен "A".

Вместо этого вам нужно сначала привести источник к правильному типу объекта, например так:

public void actionPerformed(ActionEvent e) //need help with
{
    JButton clicked = (JButton)e.getSource();

Теперь мы можем получить текст с кнопки, используя getText() вот так (хотя есть более разумное решение, которое мы можем использовать ниже):

public void actionPerformed(ActionEvent e) //need help with
{
    JButton clicked = (JButton)e.getSource();

    if(clicked.getText().equals("A")) {
        ...

Следующая проблема, с которой вы столкнетесь, это то, как вы храните данные, вам нужно отслеживать текущую ячейку с помощью переменной класса, а не просто заполнять весь массив:

private int row = 0;
private int column = 0;

Тогда все вместе изменения могут выглядеть примерно так:

//Class variables
private int row = 0;
private int column = 0;

public void actionPerformed(ActionEvent e) //need help with
{
    //Cast the event source to a button
    JButton clicked = (JButton)e.getSource();

    //Handle backspace
    if(clicked.getText().equals("<-"))
    {
        //Decrease the tracking number
        column--;
        
        //Make sure that only valid cells are back spaced
        if(column < 0)
        {
            column = 0;
        }

        //Set the cell to be blank
        g[row][column].setText("");
    }

    //Handle enter
    else if(clicked.getText().equals("["))
    {
        //Add your behaviour here
        ....

        //Finally move to the next row
        row++;
    }

    //Handle the rest of the letter buttons here
    else
    {
        //We don't need `for` loops, we can just directly add the letter from
        //the clicked button to the correct place in the array like so
        g[row][column].setText(clicked.getText);

        //Increment the tracking numbers
        column++;
        
        //Move to the next row when the column value is over 5:
        if(column > 4)
        {
            //Move to the next row
            row++;
            //Reset the column number to 0
            column = 0;
        }
    }
}

Обратите внимание, что класс ActionEvent объявляет метод getActionCommand, который по умолчанию возвращает текст JButton.

Abra 17.05.2022 06:30

Абра здесь прав, можно было бы подправить этот код, заменив clicked.getText() на e.getActionCommand(), и тогда не нужно было бы кастовать кнопку, поэтому эту строчку можно было бы убрать JButton clicked = (JButton)e.getSource();

sorifiend 17.05.2022 06:36

Спасибо, вы не можете поверить, как долго я застрял на этом, объяснение каждой строки кода так полезно, если мне когда-нибудь понадобится что-то изменить.

Brock-ly 17.05.2022 06:36

@Brock-ly Я не тестировал код, поэтому могут быть некоторые проблемы, но логика должна работать в любом случае. Вы также захотите добавить некоторую проверку ошибок, а также убедиться, что поведение строк и столбцов работает правильно и не вызывает никаких ошибок.

sorifiend 17.05.2022 06:39

Другие вопросы по теме