Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

...

I KalkulatorController.java:

Code Block
languagejava
public class KalkulatorController {
 
	... annen kode ...
 
	@FXML
	void handleDigitButton(ActionEvent event) {
		// denne setningen skriver ut hvilken knapp som kalte metoden
		System.out.println(event.getSource());
		... her er kode for tall-knappene ...
	}
}

@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

Code Block
languagejavafx
<?xml version="1.0" encoding="UTF-8"?>

<AnchorPane ...	fx:controller="kalkulator.KalkulatorController">
	<children>
		<Button text="1" onAction="#handleDigitButton" ... />
		<Button text="2" onAction="#handleDigitButton" ... />
 
	... de andre knappene kommer her ...
	</children>
</AnchorPane>

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?

ProblemKodeForklaring
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 tekstString.valueOf(num) eller "" + numDu kaller enten String.valueOf, eller legger num til "", som konverterer num i samme slengen
Sjekke om en String-variabel er ingentingif (text != null) { ... }En bruker != null for å sjekke om er variabel er ingenting
Sjekke om en String-variabel er tomif (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
languagejava
collapsetrue
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();
		}
	}
}