Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Alle delene av skjermbildet som programmet skal kunne forandre på, f.eks. gjøre synlig eller usynlig, endre teksten eller posisjonen til osv. må ha en fx:id. Denne du legge inn med Scene Builder eller FXML-editoren. I FXML-en over er dette brukt til å sette navn på Button-objektet og på Polygon-objektet (som tilsvarer den grå knivaktige tingen i hånda på strekmannen):

Code Block
<Button fx:id="trykkHerKnapp" ... text="Trykk her!" />
<Polygon fx:id="kniv" .../>

 I Java-koden må du lage en variabel med samme navn som denne fx:id-en, og typen til variablen må tilsvare typen element, f.eks Button for knapp, Polygon for mangekant Text for tekst, Line for strek:

Code Block
@FXML
Button trykkHerKnapp;
@FXML
Polygon kniv;

Du kan selvfølgelig lage andre variabler også, for å holde rede på alt som trengs for å få spillet til å virke.

...

Alt brukeren gjør og som programmet skal reagere på, må gjøres av en hendelsesmetode (samme som funksjon i Python). I FXML-en må du legge inn navnet på denne metoden i det samme elementet som skal trigge metoden og med # foran. Dette eksempel-programmet skal reagere på en knappen, så da må FXML-en se slik ut (fx:id-attributtet er for at koden skal kunne endre på teksten i knappen):

Code Block
<Button fx:id="trykkHerKnapp" ... onAction="#handleTrykkHer" text="Trykk her!" />

...

I koden i hendelsesmetodene så kan en bruke variablene for elementene som har fx:id-attributter, til å endre på skjermbildet, og dermed skape liv i skjermbildet! Hvis statusText kniv er definert som vist over, så kan du f.eks. skrive statusTextkniv.setLayoutX(kniv.getLayoutX() - 10) for å flytte kniven litt til venstre og trykkHerKnapp.setText("Melding fra programmet: ..."), for å gi en beskjed til brukeren"Du trykket meg!") for å endre på knappe-teksten.

Java-koden

Java-koden er på en måte delt i to deler:

  1. Metodene (funksjonene) main og start sørger for å starte opp programmet og laste inn FXML-innholdet i et vindu. Etter at vinduet er laget og fylt med FXML-innholdet, så settes variablene som er markert med @FXML til objektene som har tilsvarende fx:id (med litt Java-magi).

  2. Når programmet er igang vil hendelsesmetodene bli kalt når spilleren gjør bestemte ting. F.eks. vil handleTrykkHer bli kalt når brukeren trykker på knappen, fordi vi har skrevet onAction="#handleTrykkHer" i Button-elementet. Hvis du lager flere knapper, så må du finne på nye metodenavn og legge dem inn i både Java-koden og FXML-en på samme måte.

Her er koden for eksemplet:

Code Block
package trinn2;

import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.shape.Polygon;
import javafx.stage.Stage;

public class Strekmann extends Application {
    @Override
    public void start(Stage primaryStage) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(this.getClass().getResource("Strekmann.fxml"));
        fxmlLoader.setController(this);
        Parent root = (Parent) fxmlLoader.load();
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
 
    @FXML
    Button trykkHerKnapp;
    @FXML
    Polygon kniv;

    @FXML
    void handleTrykkHer() {
        double layoutX = kniv.getLayoutX() - 10;
        kniv.setLayoutX(layoutX);
        String melding = "Bom!";
        if (layoutX > 50 && layoutX < 80) {
            melding = "Treff!";
        }
        trykkHerKnapp.setText(melding);
    }
}

Det eneste hendelsesmetoden gjør er å

  • flytte kniven til venstre ved å hente ut layoutX, trekke fra 10 og legge den tilbake
  • sjekke om kniven er omtrent i blinken, ved å teste om layoutX er > 50 og < 80
  • endre på teksten i knappen for å gi melding til spilleren om det er bom eller treff

Oppgave

Prøv om du endre på layoutY for blinken, slik at du også trenger en knapp som flytter kniven opp (eller ned)! Husk at du da også må sjekke om layoutY er passende for å finne ut om det ble bom eller treff.