如何使用 actionlistener 设置 JTextFIelds 二维数组的文本?

How to setText of 2d array of JTextFIelds using actionlistener?

我的任务是创建 2 个 JPanel,一个用于二维数组,6 行,每行 5 个空 JTextField,另一个用于 JButton,它应该有点类似于屏幕键盘。我用空的 JTextFields 和 JButtons 创建了 JPanels,现在我需要一种方法,这样当我用字母表中的一个字母按下 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();
    }
}

这是我的代码,我的主要问题是使用 actionlistener 在 JTextFields 的二维数组中设置文本,我不介意为每个字母单独执行每个 if 循环,只要它有意义并且按照我的方式工作打算这样做,顺便说一句,如果你还没有注意到这是我正在尝试制作的游戏“Wordle”,我仍然是一个新手程序员,所有这些对我来说都是新的,所以一些直观的解释将不胜感激.

这一行 if(e.getSource().equals("A")) 是您的第一期。它根本行不通,因为 e.getSource() returns 一个永远不会等于 "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")) {
        ...

您面临的下一个问题是如何存储数据,您需要使用 class 变量跟踪当前单元格,而不是仅仅填充整个数组:

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;
        }
    }
}