Renaming a button after clicking - Java JButton

I try to change my button by saying "Start" to "Stop" when I click on it. My attempt to do this below, I looked through it and tried to copy the guides, but I can’t see what I'm doing wrong. Maybe I missed some kind of "}" because I left a lot of code that doesn't matter. Can anyone 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 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"); } } 
+7
source share
2 answers

Your problem is related to the limited scope of variables. Your startButton variable is declared in the constructor and therefore is visible only in the constructor. You need to declare it in the class without re-declaring it in the constructor, allowing the rest of the class to β€œsee” the variable and use it.

ie, 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... 

:

 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... 

As an alternative:

  • use jtogglebutton
  • Or use the object returned by the ActionEvent getSource() method and set its 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 irrelevant." Please make an effort to prevent this from happening. The missing "}" should not be missing, and it becomes more difficult for us to understand your code and help you. If you ask others to make an effort to help you in your free time, it does not ask you too much not to send junk code.

+5
source

You saved the final bracket of the constructor after the main method. Here is the corrected code.

 public PipeGameApp(String title) { super(title); JPanel topBar = new JPanel(); JButton startButton = new JButton("Start"); startButton.addActionListener(this); } public static void main(String[] args) { new PipeGameApp("The Frantic Pipe Layer").setVisible(true); } @Override public void actionPerformed(ActionEvent ae) { startButton.setText("asdf"); } 
+2
source

All Articles