...
I KalkulatorController.java:
@FXML brukes for å gi FXML-en lov til å kalle metoden, mens void betyr at metoden ikke skal returnere noen verdi. event-parameteret (av typen ActionEvent) inneholder informasjon om hendelsen. F.eks. kan en hente ut hvilken knapp som ble trykket med event.getSource(). Her skriver vi ut denne verdien, for å sjekke at det virker som det skal. Hvis det ikke er viktig å vite hvilken knapp som ble trykket (f.eks. hvis den bare kalles av én knapp), så trenger du ikke ha med event-parameteret i metoden. Hvis du senere ønsker å håndtere andre typer hendelser, f.eks. museklikk, så må du bruke en annen argument-type enn ActionEvent. For museklikk (og andre muse-hendelser) må du f.eks. bruke MouseEvent. | I KalkulatorApp.fxml
Både 1- og 2-knappen har onAction="#handleDigitButton", så for begge disse vil handleDigitButton blir kalt når de trykkes på. |
...
Det er din oppgave! For å gjøre det litt lettere så viser vi her noen kode-snutter for småproblemer du sikkert vil støte på underveis.
...
Hva har du lært?
Problem | Kode | Forklaring |
---|---|---|
Gjøre om fra tekst (String) to (desimal)tall (double) | Double.valueOf(text) | Du kaller Double-klassen sin valueOf-metode, for å konvertere en tekst til en double. |
Gjøre om fra (desimal)tall til tekst | String.valueOf(num) eller "" + num | Du kaller enten String.valueOf, eller legger num til "", som konverterer num i samme slengen |
Sjekke om en String-variabel er ingenting | if (text != null) { ... } | En bruker != null for å sjekke om er variabel er ingenting |
Sjekke om en String-variabel er tom | if (text.length() == 0) { ... } | text.length() gir deg antall bokstaver i en String, så her sjekker vi om antall bokstaver er 0 |
Hva har du lært?
- å koble FXML-koden til å koble FXML-koden til Java-koden med fx:id- og onAction-attributter
- å organisere koden i flere mindre metoder
- å skille mellom metoder som endrer interne variabler og de som oppdaterer app-vinduet
P.S.
Her er én av mange løsningermanger løsninger som virker omtrent som foreslått over:
Code Block | ||||
---|---|---|---|---|
| ||||
package kalkulator; import javafx.beans.property.StringProperty; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.TextField; public class KalkulatorController { private double value1memory = 0.0; private String value2valueText = null; private String operator = null; @FXML TextField valueTextField; @FXML void initialize() { updateValueField(); } private void updateValueField() { if (valueText != null) { valueTextField.setText(valueText); validateValueTextField(); @FXML void} initialize()else { updateValueField(valueTextField.setText(String.valueOf(memory)); } } private void updateValueFieldvalidateValueTextField() { if (value2 != null) {try { // prøv å konvertere teksten i tekstfeltet valueText.setText(value2Double.valueOf(valueTextField.getText()); validateValue2valueTextField.setStyle(null); } else } catch (Exception e) { valueTextvalueTextField.setText(String.valueOf(value1))setStyle("-fx-border-color: red;"); } } @FXML private void handleValueTextChangedappend2ValueText(StringProperty prop, String oldValue, String newValues) { value2if = valueText.getText(); validateValue2(); } private void validateValue2((valueText == null) { try { valueText = ""; Double.valueOf(value2);} valueText.setStyle(null)valueText = valueText + s; } }private catchvoid clearValueText(NumberFormatException e) { valueText.setStyle("-fx-border-color: red;"); valueText = null; } } private void appendToValue2convertAndStoreValueText(String s) { if (value2memory == null) { value2 = ""; } value2 = value2 + s; updateValueField(Double.valueOf(valueText); } private void convertValueTextComputeAndStoreValue() { double value = Double.valueOf(valueText); } private voidswitch performOperation(operator) { if (value2 != null) { double val2 = Double.valueOf(value2); if (operator != null) { switch (operator) { case "/": value1 = value1 / val2case "/": memory = memory / value; break; case "*": memory = memory * value; break; case "+": memory = memory + value; break; case "-": memory = memory - value; break; } } case "*": value1 = value1 * val2; break; case "+": value1 = value1 + val2; break; case "-": value1 = value1 - val2; break; } operator = nullprivate void storeOperator(String op) { operator = op; } @FXML void handleDigitButton(ActionEvent event) { Button button = (Button) event.getSource(); append2ValueText(button.getText()); updateValueField(); } @FXML void handleOperatorButton(ActionEvent event) { if (valueText != null) { if (operator != null) { convertValueTextComputeAndStoreValue(); } else { value1 = val2convertAndStoreValueText(); } this.value2 = null; } updateValueFieldclearValueText(); } privateButton button void= registerOperator(String op) {Button) event.getSource(); performOperationstoreOperator(button.getText(); operator = op)); updateValueField(); } @FXML void digithandleDesimalPoint(ActionEvent event) { Button button = (Button) event.getSource(append2ValueText("."); appendToValue2(button.getTextupdateValueField()); } @FXML void divide(@FXML void handleComputeButton() { if (valueText != null && operator != null) { registerOperator convertValueTextComputeAndStoreValue("/"); } @FXML void multiply clearValueText() {; registerOperator("*" storeOperator(null); } updateValueField(); } @FXML void add() { registerOperator("+"); } @FXML void subtract(// manuell redigering av valueTextField @FXML void handleValueTextFieldChange(StringProperty prop, String oldValue, String newValue) { registerOperator("-"); } @FXML void desimalPoint() { appendToValue2("."); } @FXML void compute() { performOperation();if (valueText != null && (! newValue.equals(valueText))) { valueText = newValue; validateValueTextField(); } } } |