2013-03-08 3 views
7

Ich versuche, meine Schaltfläche von "Start" zu "Stop" zu ändern, wenn ich darauf klicke. Mein Versuch, dies zu tun, ist unten, ich habe nachgeschaut und versucht, die Anleitungen zu kopieren, aber ich sehe nicht, was ich falsch mache. Ich könnte etwas "}" vermissen, weil ich viel Code weggelassen habe, der irrelevant ist. Kann jemand sehen, was ich falsch mache?Umbenennen einer Schaltfläche nach dem Klicken - Java JButton

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"); 
    } 
} 
+0

Bitte bearbeite meine Antwort. Ihr Problem ist nicht das Problem der variablen Beschattung, sondern der variable Umfang. Ich bin überrascht, dass Ihr Code kompiliert wird, da Sie keinen Klassenverweis auf den StartButton haben. Oder kompiliert es tatsächlich nicht? –

Antwort

5

Ihr Problem ist ein begrenzter Geltungsbereich von Variablen. Ihre startButton-Variable wird im Konstruktor deklariert und ist daher nur im Konstruktor sichtbar. Sie müssen es in der Klasse deklarieren und nicht im Konstruktor deklarieren, damit der Rest der Klasse die Variable "sehen" und verwenden kann.

dh das ändern:

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

dazu:

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

Alternativ:

  • Einen JToggleButton verwenden
  • oder das von der getSource() Methode der Actionzurückgegebene Objekt verwenden , und setze den neuen Status basierend auf i ts aktuelle Zustand.

Zum Beispiel

@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 
     } 
    } 
} 

"I might be missing some "}" because I left out a lot of the code that's irrelevant." In Bezug auf Bitte in der Mühe geben, damit dies nicht geschieht. Das fehlende "}" sollte nicht fehlen und macht es uns schwerer, Ihren Code zu verstehen und Ihnen zu helfen. Wenn Sie andere darum bitten, sich in ihrer Freizeit um Hilfe zu bemühen, werden Sie nicht zu sehr darum gebeten, keinen Junk-Code zu veröffentlichen.

+0

Vielen Dank, ich werde meinen gesamten Code posten. Ich denke, ich werde die getSource-Methode verwenden, da ich die Tasten brauche, um zu wechseln. – user1692517

+0

@ user1692517: froh, dass Sie es gelöst haben. Bitte haben Sie Verständnis, dass "all mein Code" oft zu viel ist. Am wichtigsten ist, dass du keinen Junk-Code postest, wie du es ursprünglich getan hast. Diese fehlende Klammer ist nicht irrelevant, aber in der Tat ist ziemlich wichtig. Es verursachte einen Helfer, Ravindra, seine wertvolle freie Zeit zu verschwenden, indem er versuchte, dir mit einem Nicht-Problem zu helfen, was für ihn nicht fair ist. –

2

Sie hielt die Endstrebe Konstruktor nach main Methode. Hier ist der korrigierte 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"); 
}