...
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:
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 valueTextvalueTextField; @FXML void initialize() { updateValueField(); } private void updateValueField() { if (value2valueText != null) { valueTextvalueTextField.setText(value2valueText); validateValue2validateValueTextField(); } else { valueTextvalueTextField.setText(String.valueOf(value1memory)); } } @FXML private void handleValueTextChanged(StringProperty prop, String oldValue, String newValuevalidateValueTextField() { value2 = valueText.getText();try { validateValue2(); } private void validateValue2() { try { // prøv å konvertere teksten i tekstfeltet Double.valueOf(valueTextField.getText(value2)); valueTextvalueTextField.setStyle(null); } catch (NumberFormatExceptionException e) { valueTextvalueTextField.setStyle("-fx-border-color: red;"); } } private void appendToValue2append2ValueText(String s) { if (value2valueText == null) { value2valueText = ""; } value2valueText = value2valueText + s; updateValueField()} private void clearValueText() { valueText = null; } private void performOperationconvertAndStoreValueText() { if (value2 != null memory = Double.valueOf(valueText); } private void convertValueTextComputeAndStoreValue() { double val2value = Double.valueOf(value2valueText); ifswitch (operator != null) { switch (operator) { case "/": memory = memory / value; break; case "*": memory = memory * value; break; case "/+": value1memory = value1memory /+ val2value; break; case "*-": value1memory = value1memory *- val2value; 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 opButton) { performOperationevent.getSource(); operator = opstoreOperator(button.getText()); updateValueField(); } @FXML void digithandleDesimalPoint(ActionEvent event) { Button button = (Button) event.getSource(append2ValueText("."); appendToValue2updateValueField(button.getText()); } @FXML void handleComputeButton() { @FXML void divide( 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(); } } } |