JavaFX von der IDE bis zur Auslieferung Teil 4: Action bitte
In den letzten Teilen haben wir unsere Oberfläche mit Leben gefüllt, leider sind sämtliche Komponenten noch relativ inaktiv.
Es gibt mehrere Möglichkeiten unsere Komponenten mit Aktionen zu füllen.
Zum einen kann man eine fx:id vergeben, über die man anschließend im Controller auf die Komponente zugreifen kann.
Zum anderen kann man in onAction auch direkt einen Funktionsnamen übergeben.
Um auf eine Komponente im Controller zuzugreifen muss man die Komponent im Kopf mit Anotation @FXML global definieren.
Beispiel: Das erste Textfeld gibt man die ID txtNumber1. Um auf diese Komponenten im Controller darauf zuzugreifen muss man nun vor onInitialize die Komponente deklarieren:
private @FXML TextField txtNumber1;
Hat man direkt eine Funktion in onAction eingetragen, so muss man diese auch im Controller definieren.
@FXML
public void enterCalculation(ActionEvent actionEvent) {}
Man muss hierbei nicht unbedingt ActionEvent definieren.
Hat man nur eine ID vergeben, so kann man auch hier durch folgenden Code eine Action definieren:
this.txtNumber1.setOnAction(actionEvent -> {});
Damit unsere Anwendung nun funktioniert und rechnet wurden für die beiden TextFelder die Ids txtNumber1 und txtNumber2 vergeben. Allen Buttons mit Ausnahme des "=" und des "<" wurde eine Funktion mit dem Namen enterCalculation zugewiesen. Dem "=" wurde die Funktion calculate und dem "<" wurde die Funktion back zugewiesen.
Der Code im Controller:
@FXML
public void enterCalculation(ActionEvent actionEvent) {
if(actionEvent.getSource() instanceof Button) {
Button parent = (Button) actionEvent.getSource();
String value = parent.getText().replace(",", ".");
String content1 = this.txtNumber1.getText().trim();
String content2 = this.txtNumber2.getText().trim();
if(content1.endsWith(PLUS) || content1.endsWith(MINUS) || content1.endsWith(MUL) || content1.endsWith(DIV)) {
if(content2.endsWith(PLUS) || content2.endsWith(MINUS) || content2.endsWith(MUL) || content2.endsWith(DIV)) {
this.txtNumber1.setText(this.txtNumber1.getText() + this.txtNumber2.getText());
this.txtNumber2.setText(value);
} else {
this.txtNumber2.setText(this.txtNumber2.getText() + value);
}
} else {
this.txtNumber1.setText(this.txtNumber1.getText() + value);
}
}
}
@FXML
public void calculate() {
String content = this.txtNumber1.getText().trim() + this.txtNumber2.getText().trim();
Double number = getNumber(content);
while(number == null) {
content = this.calculate(content);
number = getNumber(content);
}
this.txtNumber1.setText(String.valueOf(number));
this.txtNumber2.setText("");
}
private Double getNumber(String content) {
try {
return Double.parseDouble(content);
} catch (Exception ignored) {}
return null;
}
private String calculate(String content) {
String operator;
if(content.contains(MUL)) {
operator = MUL;
} else if(content.contains(DIV)) {
operator = DIV;
} else if(content.contains(MINUS)) {
operator = MINUS;
} else {
operator = PLUS;
}
String firstPart = content.substring(0, content.lastIndexOf(operator));
String lastPart = content.substring(content.lastIndexOf(operator) + 1);
int index = indexOf(firstPart, false);
if(index==firstPart.length()) {
index = 0;
}
String number1 = firstPart.substring(index);
String number2 = lastPart.substring(0, indexOf(lastPart, true));
Double n1 = getNumber(number1);
Double n2 = getNumber(number2);
if(n1 != null && n2 != null) {
double result;
switch (operator) {
case "*":
result = n1 * n2;
break;
case "/":
result = n1 / n2;
break;
case "-":
result = n1 - n2;
break;
default:
result = n1 + n2;
}
return content.replace(number1 + operator + number2, String.valueOf(result));
}
return content;
}
private int indexOf(String content, boolean first) {
int index;
int tmp;
if(first) {
index = content.indexOf(PLUS);
tmp = content.indexOf(MINUS);
if(index < tmp) {
index = tmp;
}
tmp = content.indexOf(MUL);
if(index < tmp) {
index = tmp;
}
tmp = content.indexOf(DIV);
if(index < tmp) {
index = tmp;
}
} else {
index = content.lastIndexOf(PLUS);
tmp = content.lastIndexOf(MINUS);
if(index > tmp && tmp != -1) {
index = tmp;
}
tmp = content.lastIndexOf(MUL);
if(index > tmp && tmp != -1) {
index = tmp;
}
tmp = content.lastIndexOf(DIV);
if(index > tmp && tmp != -1) {
index = tmp;
}
}
if(index!=-1) {
return index + 1;
} else {
return content.length();
}
}
@FXML
public void back() {
if(!this.txtNumber2.getText().trim().isEmpty()) {
this.txtNumber2.setText(this.txtNumber2.getText(0, this.txtNumber2.getText().length()-1));
} else {
this.txtNumber1.setText(this.txtNumber1.getText(0, this.txtNumber1.getText().length()-1));
}
}
Falls irgendetwas nicht so geklappt haben sollte, wie Sie es gerne hätten, können Sie gerne im Github-Repository nachschauen oder über einen Kommentar fragen.
Fortsetzung folgt...
Kommentare
Kommentar veröffentlichen