1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

(Java GUI)Changing the Text of a JButton once its pressed.

  1. Sep 12, 2012 #1
    1. The problem statement, all variables and given/known data
    Im a big rookie in Java ( and pretty much every language). I am trying to make a Minesweeper game for an assignment and I am still in the beta stages. I am stuck however on how to display the mines as a "0" once the button is pressed. I created the Jbuttons using a 2d array, but I cant seem to put the "0" on the specific button I want.

    Here is my code ( please excuse the ugliness/ probable inefficiency) I really am clueless when it comes to GUI's.


    2. Relevant equations
    Code (Text):
    import java.awt.*;
    import javax.swing.*;
    import java.awt.GridLayout;
    import java.awt.event.*;
    import java.awt.geom.*;
    import javax.swing.event.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JOptionPane;
    import javax.swing.JFrame;

    public class Grid extends JPanel {
        // Initializes rows,columns and mines
        int rows = 10;
        int cols = 10;
        int i, j = 0;
        int mines = 10;
        boolean[][] setmine = new boolean[rows][cols];
        boolean[][] clickable = new boolean[rows][cols];
        private JToggleButton squares[][], squares2[][];

        // Contructor for creating a grid(with default size 400x400
        public Grid() {
            this.setSize(600, 600);
            this.setLayout(new GridLayout(rows, cols));
            squares = new JToggleButton[rows][cols];
            buildButtons();
        }

        private void buildButtons() {
            // loops are used for creating the "buttons" on the grid.
            int MinesNeeded = 10;
            // builds buttons
            // ----------------------------------------
            for (i = 0; i < rows; i++) {
                for (j = 0; j < cols; j++) {
                    squares[i][j] = new JToggleButton();
                    // squares[i][j].setEnabled(false);
                    squares[i][j].setSize(600, 600);

                    // --------------------------------------------------
                    // This part randomises the mines
                    // -----------------------------------------------------
                    while (MinesNeeded > 0) {

                        int x = (int) Math.floor(Math.random() * rows);
                        int y = (int) Math.floor(Math.random() * cols);
                        if (!setmine[x][y]) {
                            setmine[x][y] = true;

                            MinesNeeded--;
                        }
                    }
                    // ----------------------------------------------------------------------------

                    this.add(squares[i][j]);

                    if (setmine[i][j] == true) {

                        squares[i][j].addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent ae) {
                                // this is the problem
                                squares[i][j].setText("0");
                            }
                        });
                    }
                }
            }
        }

        public static void main(String[] args) {
            Grid g = new Grid();
            JFrame frame = new JFrame("Minesweeper");

            frame.add(g);
            frame.setSize(600, 600);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }

     
    3. The attempt at a solution
     
  2. jcsd
  3. Sep 12, 2012 #2

    gabbagabbahey

    User Avatar
    Homework Helper
    Gold Member

    I think the problem is that when actionPerformed is called, you have already completely gone through your loops, and so i=j=10, and of course, squares[10][10] will throw an index out of range exception. Instead of using squares[j] in that method, try utilizing the method parameter ae in order to set the text on the correct button.
     
  4. Sep 12, 2012 #3


    Thank you for the swift reply. Im almost 100% sure that is the problem. Could you guide me on how to use the method parameter to set the text? (I dont understand what the method parameter does in Action Listener ( I used ActionListener for the first time yersterday))
     
  5. Sep 12, 2012 #4
    Nevermind, I got it to work. Thanks a lot
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: (Java GUI)Changing the Text of a JButton once its pressed.
Loading...