Tennis- Spielstand/ Anzeiger mit Java programmieren?
Hallo zusammen,
Ich muss für die Schule eine Art Anzeigetafel für ein Tennismatch programmieren. Der User kickt entweder auf den Button Spieler 1 oder Spieler 2 (je nach dem wer der Punkt gemacht hat) und dann soll sich der Spielstand verändern.
Aktueller Stand: Ich habe eine GUI mit den Buttons und den relevanten Textfeldern erstellt.
D.h: btnSpieler1, btnSpieler2, txtPunkte1, txtPunkte2
Hauptfrage:
- Durch lange Recherche weiß ich mittlerweile, dass ich einen klick- Zähler benötige, also wie oft auf welchen Button geklickt wurde. Allerdings bin ich völlig ahnungslos wie...
Nebenfrage: Nun zählt man beim Tennis ja nicht 1,2,3,... sondern 15, 30, 40, Spiel.
- Ist das eine gute Idee, dieses "Problem" mit if- else zu lösen?
Also z.B:
if ("Anzahl klick auf Button1" = 1)
txtPunkte1.setText("15");
else if ...
Schonmal vielen Dank im Voraus
1 Antwort
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()]);