Programmieren – die besten Beiträge

JavaFX Button auf Controller Funktion zeigen?

Ich will einen Taschenrechner programmieren. Backend logik ist soweit vorhanden, fehlt nur das GUI

Ich dachte mir, dass ich eine Klasse mache, wo ich das GridPane extende und im Konstruktor die buttons adde.

So sieht das etwa aus:

public class FXPane extends GridPane {
    private String[][] buttonTexts = {
            {"7", "8", "9", "(", ")", "BS"},
            {"4", "5", "6", "+", "-", "CE"},
            {"1", "2", "3", "*", "/", "C"},
            {"±", "0", ",", "x^y", "1/x", "="}
    };

    FXPane() {
        for(int y = 0; y < buttonTexts.length;y++){
            for(int x = 0; x<buttonTexts[0].length;x++){
                Button theButtonToAdd = new Button(buttonTexts[y][x]);
                theButtonToAdd.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
                this.add(theButtonToAdd,x,y);
            }
        }
    }
}

Der Controller sieht so aus:

public class Controller {
    @FXML
    private Label fxDisplay;
    @FXML
    private GridPane fxGrid;

    private FXPane buttonPane = new FXPane();

    // called by the FXML loader after the labels declared above are injected:
    public void initialize() {
        fxDisplay.setText("asd");
        fxGrid.add(buttonPane,0,0);
    }
}

Die Namen und der Hack über 2 Gridpanes änder ich noch, geht aber derzeit eher POC, da es das erste mal mit JavaFX ist.

Mein Plan ist, dass die Buttons auf eine Funktion aus dem Controller zeigt bzw aufruft.

Nur ist das vermutlich nicht (schön) möglich. Gibts ne bessere Variante oder ist das der einzige Weg?

Der Plan war, dass der Controller die Taschenrechner Instanz besitzt und jeder Button dann die eingabe an die Taschenrechner Instanz gibt. Nur brauche ich dafür halt noch ein übersetzer, damit der jeweilige Button die jeweilige Eingabe in den Taschenrechner gibt.

Ich könnte natürlich die Controller Instanz per this dem Konstruktor übergeben und dann in FXPane speichern. Nur ist das gut?

Computer, Technik, programmieren, Java, JavaFX, Technologie, GUI

Warum ist der Code unreachable?

import os
import sys


# Wilkommensnachricht
print("Tic-Tac-Toe Python")


# Variablen
spiel_aktiv = True
spieler_aktuell = 'X'
versuche = 0


# Spielfeld als Liste erstellen
spielfeld = [" ",
             "1","2","3",
             "4","5","6",
             "7","8","9"]


# Spielfeld ausgeben
def spielfeld_ausgeben():
    print (spielfeld[1] + "|" + spielfeld[2] + "|" + spielfeld[3] )
    print (spielfeld[4] + "|" + spielfeld[5] + "|" + spielfeld[6] )
    print (spielfeld[7] + "|" + spielfeld[8] + "|" + spielfeld[9] )



# Die Spieler Eingabe
def spieler_eingabe():
    while True:
        global versuche
        spieler_zug = input("Auf welches Feld setzt du? ")
        spieler_zug = int(spieler_zug)
        spielfeld[spieler_zug] = spieler_aktuell
        versuche += 1




# Kontrolle ob und wer das Spiel gewonnen hat.
def kontrolle_gewonnen():
    if spielfeld[1] == spielfeld[2] == spielfeld[3]:
        print("Du hast gewonnen", spieler_aktuell)
    if spielfeld[4] == spielfeld[5] == spielfeld[6]:
        print("Du hast gewonnen", spieler_aktuell)
    if spielfeld[7] == spielfeld[8] == spielfeld[9]:
        print("Du hast gewonnen", spieler_aktuell)
    # Kontrolle auf Spalten
    if spielfeld[1] == spielfeld[4] == spielfeld[7]:
        print("Du hast gewonnen", spieler_aktuell)
    if spielfeld[2] == spielfeld[5] == spielfeld[8]:
        print("Du hast gewonnen", spieler_aktuell)
    if spielfeld[3] == spielfeld[6] == spielfeld[9]:
        print("Du hast gewonnen", spieler_aktuell)


    # Kontrolle auf Diagonalen
    if spielfeld[1] == spielfeld[5] == spielfeld[9]:
        print("Du hast gewonnen", spieler_aktuell)


    if spielfeld[7] == spielfeld[5] == spielfeld[3]:
        print("Du hast gewonnen", spieler_aktuell)  


# Kontrolle ob unentschieden
def kontrolle_auf_unentschieden():
    if versuche == 9:
        print("Unentschieden!")


# Den aktiven Spieler wechseln X/O
def spieler_change():
    global spieler_aktuell
    if spieler_aktuell == "X":
        spieler_aktuell = "O"
    else:
        spieler_aktuell = 'X'



def main():
  spielfeld_ausgeben()
  while True:
    spieler_eingabe()
    # Code unreachable
    spielfeld_ausgeben()
    kontrolle_gewonnen()
    kontrolle_auf_unentschieden()
    spieler_change()
    # Ende von Code unreacheable
main()
Computer, Schule, Technik, programmieren, Python, Technologie

Meistgelesene Beiträge zum Thema Programmieren