Under ser du et utkast til en mobil-app for sykkelutleietjenesten, basert på FXML. Kartet til venstre viser hvor det er sykler, og én stasjon er valgt (og implisitt også en sykkel på stasjonen). Brukeren kan endre antatt tidspunkt for tilbakelevering ved å endre teksten i tekstfeltet eller bruke knappene til høyre for feltet. Den vesentlige (for denne oppgaven) FXML-koden er vist til høyre. | <VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="kont2019.bike.BikeRentalController"> ... <TextField fx:id="fromInput"/> <TextField fx:id="toInput"/> ... <Button onAction="#plus1HourAction" text="+ 1 hour"/> <Button onAction="#minus1HourAction" text="- 1 hour"/> <Button onAction="#rentAction" text="Rent"/> </VBox>
|
Oppgave 4a)Gitt denne FXML-koden, hvilke kode-elementer (klasser, felt og metoder) må finnes i koden som implementerer oppførselen (logikken) til appen? Expand |
---|
| Av FXML-koden kan en lese at det grafiske grensesnittet (appen) knyttes til BikeRental ved hjelp av klassen BikeRentalController. Dette er i tråd med navnekonvensjonene brukt i tidligere eksamener. Det refereres til to tekstfelt som en i koden kobler seg til med henholdsvis @FXML private TextField fromInput og toInput. Likeledes må en lage tre metoder (@FXML private void plus1HourAction, minus1HourAction og rentAction) som kalles når knappene i grensesnittet trykkes inn. |
Oppgave 4b)I kodeskjelettet er ufullstendig kode for oppførselen til appen angitt (Kontroller-logikk). Fyll ut de manglende kodeelementene, som angitt i kommentarer eller markert med ??? Det er lov å anta at LocalDateTime-klassen har konstruktør og metode for konvertering fra og til String, samt metoder for å lage nye LocalDateTime-instanser et gitt antall sekunder før og etter. Expand |
---|
| Her er det (foreløpig) lagt inn mer kode enn de ulike metodene som skulle implementeres i oppgaven. Code Block |
---|
| public class BikeRentalController {
private final BikeRental bikeRental;
private final Person me;
private final Bike bike;
public BikeRentalController() {
bikeRental = new BikeRental();
final GeoLocation here = new GeoLocation(63, 10);
bikeRental.addPlace(here);
bike = new Bike();
bikeRental.addBike(bike, here);
me = new Person("Hallvard");
}
private final LocalTimeStringConverter localTimeStringConverter = new LocalTimeStringConverter();
@FXML
public void initialize() {
setFromTime(LocalTime.now());
setToTime(LocalTime.now().plus(1, ChronoUnit.HOURS));
Platform.runLater(() -> toInput.requestFocus());
}
@FXML
private TextField fromInput;
@FXML
private TextField toInput;
/**
* @return a LocalDataTime object corresponding to the from input field value
*/
private LocalTime getFromTime() {
return localTimeStringConverter.fromString(fromInput.getText());
}
/**
* Updates the from input field value according to the LocalDateTime argument
* @param time
*/
private void setFromTime(final LocalTime time) {
fromInput.setText(localTimeStringConverter.toString(time));
}
private LocalTime getToTime() {
return localTimeStringConverter.fromString(toInput.getText());
}
private void setToTime(final LocalTime time) {
toInput.setText(localTimeStringConverter.toString(time));
}
@FXML
public void plus1HourAction() {
setToTime(getToTime().plus(1, ChronoUnit.HOURS));
}
@FXML
public void minus1HourAction() {
setToTime(getToTime().minus(1, ChronoUnit.HOURS));
}
private LocalDateTime toLocalDateTime(final LocalTime time) {
return LocalDateTime.now().withHour(time.getHour()).withMinute(time.getMinute());
}
@FXML
public void rentAction() {
bikeRental.rentBike(me, bike, toLocalDateTime(getFromTime()) , toLocalDateTime(getToTime()));
}
} |
|
|