Tennis- Spielstand/ Anzeiger mit Java programmieren?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

Du musst jedem Button einen Listener hinzufügen, der definiert, wie auf den Klick reagiert werden soll. Ein ActionListener würde sich dafür eignen.

Generell sollte dieser als Controller-Instanz eingesetzt werden und das gesamte Programmdesign nach dem MVC-Pattern ausgerichtet werden. Das heißt, es gibt eine Klasse, die sich um die grafische Oberfläche kümmert, eine Klasse, die das Model darstellt (die Daten verwaltet) und Controller, die die Kommunikation zwischen View und Model übernehmen.

Listener (Controller):

public class Counter implements ActionListener {
  private GameState _state;

  public Counter(GameState state) {
    _state = state;
  }
      
  @Override
  public void actionPerformed(ActionEvent event) {
    JButton button = (JButton) event.getSource();
    
    if (button.getName().equals("playerOne")) {
      // increment counter for player one
      return;
    }

    if (button.getName().equals("playerTwo")) {
      // increment counter for player two
      return;
    }
  }
}

Anhängen des Listeners (im Konstruktor der View-Instanz, also der Klasse, wo der JFrame erstellt wird):

public View(Counter counter) {
  // ...
  playerOneButton.addActionListener(counter);
  playerTwoButton.addActionListener(counter);
  // ...
}

GameState (Model):

public class GameState() {
  private int _pointsPlayerOne;
  
  private int _pointsPlayerTwo;

  public void incrementPointsPlayerOne(int points) {
    _pointsPlayerOne += points;
  }

  public void incrementPointsPlayerTwo(int points) {
    _pointsPlayerTwo += points;
  }
}

Und beim Erstellen der einzelnen Komponenten:

GameState state = new GameState();
Counter counter = new Counter(state);
View view = new View(counter); // view is a subclass from JFrame
view.setVisible(true);
Ist das eine gute Idee, dieses "Problem" mit if- else zu lösen?

Zähle intern ruhig normal mit 1, 2, 3, ... Für die Oberfläche/Ausgabe kannst du das dann ja umformen. Zum Beispiel über switch-case oder über ein Array:

// show points ... 
// pointStates: new int[] { 15, 30, 40 }
_pointsLabelPlayerOne.setText(pointStates[state.getPointsOfPlayerOne()]);