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");
}
}
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:
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.