...
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. ...
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 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 (men bruker litt andre navn på variabler og metoder):
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 value1 = 0.0; private String value2 = null; private String operator = null; @FXML TextField valueText; @FXML void initialize() { updateValueField(); } private void updateValueField() { if (value2 != null) { valueText.setText(value2); validateValue2(); } else { valueText.setText(String.valueOf(value1)); } } @FXML void handleValueTextChanged(StringProperty prop, String oldValue, String newValue) { value2 = valueText.getText(); validateValue2(); } private void validateValue2() { try { Double.valueOf(value2); valueText.setStyle(null); } catch (NumberFormatException e) { valueText.setStyle("-fx-border-color: red;"); } } private void appendToValue2(String s) { if (value2 == null) { value2 = ""; } value2 = value2 + s; updateValueField(); } private void performOperation() { if (value2 != null) { double val2 = Double.valueOf(value2); if (operator != null) { switch (operator) { case "/": value1 = value1 / val2; break; case "*": value1 = value1 * val2; break; case "+": value1 = value1 + val2; break; case "-": value1 = value1 - val2; break; } operator = null; } else { value1 = val2; } this.value2 = null; } updateValueField(); } private void registerOperator(String op) { performOperation(); operator = op; updateValueField(); } @FXML void digit(ActionEvent event) { Button button = (Button) event.getSource(); appendToValue2(button.getText()); } @FXML void divide() { registerOperator("/"); } @FXML void multiply() { registerOperator("*"); } @FXML void add() { registerOperator("+"); } @FXML void subtract() { registerOperator("-"); } @FXML void desimalPoint() { appendToValue2("."); } @FXML void compute() { performOperation(); } } |
...