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?
2 Antworten
Wie schon in deiner vorherigen Frage gezeigt: Mit setOnAction kannst du einen Event Handler an einen Button hängen. Das wäre auch dein Controller.
Wenn du nur einen Controller für alle Buttons verwenden möchtest:
Controller controller = new Controller();
for (/* ... */) {
/* ... */
button.setOnAction(controller);
}
Die Controller-Klasse implementiert das EventHandler-Interface und verfügt über Möglichkeiten, die notwendigen Aktionen (Addition, Subtraktion, etc.) aufzurufen.
Als ich meine ersten Schritte mit GUIs gemacht habe, hab ich auch einen einfachen Taschenrechner gebaut. Ich hab es damals einfach so gemacht, dass jeder Button dieselbe Methode aufgerufen hat und die Methode hat dann anhand der Beschriftung des Buttons entschieden, was gemacht werden soll. Ob du die Methode jetzt im FXPane oder im Controller einbaust, dürfte ziemlich egal sein. Hauptsache du hast von der Methode auf zugriff auf das "Display" des Taschenrechners.
Ja, so plane ich das derzeit auch. Wüsste derzeit noch nicht wie anders.
Die Idee ist aber, dass die Taschenrechnerlogik ein Schlüsselloch hat. Die Backendlogik ist also alles über Calculator.java abgehandelt. Davon hab ich eine Instanz im rootController (oben der Controller)