Home > Net >  How to setText of 2d array of JTextFIelds using actionlistener?
How to setText of 2d array of JTextFIelds using actionlistener?

Time:05-17

My assignment is to create 2 JPanels, one for a 2d array, 6 rows of 5 empty JTextFields and another for JButtons that should somewhat resemble an on-screen keyboard. I created the JPanels with the empty JTextFields and JButtons, now I need a way so that when I press a JButton with a letter from the alphabet it will assign that letter to the first available JTextField on the first available row and move one column at a time until the whole row is filled with letters (trying to add letters to a full row should do nothing). I also need to create a backspace button which I have that will remove the last letter (pressing backspace on an empty row should do nothing).

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

This is my code and my main issue is setting the text in the 2d array of JTextFields using actionlistener, I don't mind doing each if loop for each letter individually as long as it makes sense and works the way I intended it to, btw if you haven't already noticed this is the game "Wordle" I am trying to make, I'm still a newbie programmer and all of this is new to me so some kind of intuitive explanation would be much appreciated.

CodePudding user response:

This line if(e.getSource().equals("A")) is your first issue. It simply will not work because e.getSource() returns an object that will never equal "A".

Instead, you need to first cast the source to the correct object type like so:

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

Now we can now get the text from the button using use getText() like this (Although there is a smarter solution we can use down below):

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

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

The next issue you face is how you store the data, you need to track the current cell using a class variable, rather than just filling up the whole array:

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

Then all together the changes might look a bit like this:

//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;
        }
    }
}
  • Related