Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Renaming a button after clicking - Java JButton

I'm trying to change my button from saying "Start" to "Stop" when I click on it. My attempt at doing this is below, I looked it up and tried to copy the guides but I don't see what I'm doing wrong. I might be missing some "}" because I left out a lot of the code that's irrelevant. Can someone see what I'm doing wrong?

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

public class PipeGameApp extends JFrame implements ActionListener {

    private static int BOARD_SIZE = 11;
    private PipeGame game;      // The model
    private PipeGameView view;      // The view

    // This constructor builds the window
    public PipeGameApp(String title) {
        super(title);

        game = new PipeGame(BOARD_SIZE);
        view = new PipeGameView(game);

        //THE TOP BAR
        JPanel topBar = new JPanel();
        JButton startButton = new JButton("Start");
        startButton.addActionListener(this);



        ButtonGroup bg1 = new ButtonGroup();
        JRadioButton rb1 = new JRadioButton("2 minutes", true);
        rb1.addActionListener(this);


        JRadioButton rb2 = new JRadioButton("10 minutes", false);
        JRadioButton rb3 = new JRadioButton("No Time Limit", false);
        bg1.add(rb1);
        bg1.add(rb2);
        bg1.add(rb3);





        topBar.add(startButton);
        topBar.add(rb1);
        topBar.add(rb2);
        topBar.add(rb3);
        //END OF TOP BAR

        //THE BOTTOM BAR
        JPanel bottomBar = new JPanel();
        JLabel timeLeft = new JLabel("Time Left: ");
        JProgressBar bar = new JProgressBar();
        bottomBar.add(timeLeft);
        bottomBar.add(bar);
        bottomBar.setVisible(false);
        //end of bottom

        /*
         //bottom 2
         int fscore=10;
         JPanel bottomBar2 = new JPanel();
         JLabel score = new JLabel("Final score:" + fscore);
         bottomBar2.add(score);
         bottomBar2.setVisible(false);
         */


        getContentPane().add(view); //CHANGE LOCATION OF BOARD GAME HERE BorderLayout.SOUTH

        getContentPane().add(topBar, BorderLayout.NORTH);
        getContentPane().add(bottomBar, BorderLayout.SOUTH);

        //getContentPane().add(bottomBar2, BorderLayout.SOUTH);



        // Add the listeners to the view's buttons
        for (int r = 0; r < BOARD_SIZE; r++) {
            for (int c = 0; c < BOARD_SIZE; c++) {
                view.getButton(r, c).addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        handleTileSelection(e);
                    }
                });
            }
        }

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //setSize(446,466);
        setSize(446, 530);
        setResizable(false);
    }

    // Handle a Tile Selection.   Just change the model and update the view.
    private void handleTileSelection(ActionEvent e) {
        // Find the row and column of the pressed button, then make the change
        int r = 0, c = 0;
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                if (e.getSource() == view.getButton(i, j)) {
                    if (game.placePipe(i, j)) {
                        view.update();
                    }
                    return;
                }
            }
        }
    }

    // This is where it all begins
    public static void main(String[] args) {
        new PipeGameApp("The Frantic Pipe Layer").setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        startButton.setText("asdf");
    }
}
like image 409
user1692517 Avatar asked Mar 08 '13 03:03

user1692517


People also ask

How do you rename a button in Java?

addActionListener(this); // etc... use A JToggleButton. Or use the object returned by the ActionEvent's getSource() method, and set it's new state based on its current state.

What is the difference between button and JButton in Java?

JButton class provided by Swing is totally different from Button which is provided by AWT. It is used to add platform independent button in swing application. Swing buttons are extended from the AbstractButton class that is derived from JComponent. AbstractButton class implements the Accessible interface.

What does JButton do in Java?

The JButton class is used to create a labeled button that has platform independent implementation. The application result in some action when the button is pushed. It inherits AbstractButton class.


1 Answers

Your problem is one of limited variable scope. Your startButton variable is being declared in the constructor and thus is only visible in the constructor. You need to declare it in the class not re-declare it in the constructor allowing the rest of the class to be able to "see" the variable and use it.

i.e., change this:

public class PipeGameApp extends JFrame implements ActionListener {

    private static int BOARD_SIZE = 11;
    private PipeGame game;      // The model
    private PipeGameView view;      // The view

    public PipeGameApp(String title) {

        JButton startButton = new JButton("Start");
        startButton.addActionListener(this);
        // etc...

to this:

public class PipeGameApp extends JFrame implements ActionListener {

    private static int BOARD_SIZE = 11;
    private PipeGame game;      // The model
    private PipeGameView view;      // The view
    private JButton startButton; // *** note change ***

    public PipeGameApp(String title) {

        startButton = new JButton("Start"); // *** note change ***
        startButton.addActionListener(this);
        // etc...

Alternatively:

  • use A JToggleButton
  • Or use the object returned by the ActionEvent's getSource() method, and set it's new state based on its current state.

For example,

@Override
public void actionPerformed(ActionEvent ae) {
    Object source = ae.getSource();
    if (source instanceof JButton) {
       if (ae.getText().equals("Start")) {
          ae.setText("Stop");
          // do other stuff
       } else if (ae.getText().equals("Stop")) {
          ae.setText("Start");
          // do more stuff
       }
    }
}

Regarding "I might be missing some "}" because I left out a lot of the code that's irrelevant." Please put in the effort so that this doesn't happen. That missing "}" shouldn't be missing and makes it harder for us to understand your code and to help you. If you're asking others to put in the effort to help you on their free time, it's not asking you too much to not post junk code.

like image 174
Hovercraft Full Of Eels Avatar answered Oct 12 '22 18:10

Hovercraft Full Of Eels