Lekcja 10

Wykonywanie kodu

Jak wykonywać kod programu, gdy ktoś naciśnie przycisk? Aby to osiągnąć, będziemy odwoływać się do definicji elementów widoku.

I. Słowem o adnotacjach


Zadanie 0

Poniższy kod zawiera jedno dobre i jedno błędne użycie adnotacji @Override.

Zastanów się, a następnie przekopiuj kod do IDE i sprawdź swoje przewidywania.


class Person {
    public void sayHello() {
        System.out.println("Hello");
    }
}
class Terminator extends Person {
    
    @Override
    public void willBeBack() {
        System.out.println("I will be back");
    }

    public void sayHello() {
        System.out.println("Hasta la vista, baby");
    }

}
class DarthVader extends Person {
    
    @Override
    public void sayHello() {
        System.out.println("I am your father.");
    }
}

II. Przygotowanie pliku .fxml


Zadanie 1

Przekopiuj kod (fxml+java) i uruchom program. Odpowiedz na pytania:

  1. W którym miejscu widok jest dowiązywany do właściwego kontrolera? (fxml)
  2. Która wartość i jakiego atrybutu przypisuje akcji metodę do wykonania? (fxml)
  3. Który zapis daje możliwość zdefiniowania akcji? (java)

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane
    prefHeight="400.0"
    prefWidth="600.0"
    xmlns="http://javafx.com/javafx/8.0.121"
    xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="MainController">

    <Button
        layoutX="20.0"
        layoutY="20.0"
        text="Kliknij mnie"
        onAction="#onButtonClick" />

</AnchorPane>

import javafx.fxml.FXML;

public class MainController {
    
    @FXML
    private void onButtonClick() {
        System.out.println("Naciśnięto przycisk");
    }
    
}

III. Wpływanie na inne kontrolki


Zadanie 2

Tworzymy element Text z przypisanym, unikalnym identyfikatorem (fx:id).


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

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane
    prefHeight="400.0"
    prefWidth="600.0"
    xmlns="http://javafx.com/javafx/8.0.121"
    xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="MainController">

    <Button
        layoutX="20.0"
        layoutY="20.0"
        text="Kliknij mnie"
        onAction="#onButtonClick" />

    <Text
        fx:id="mainText"
        layoutX="40.0"
        layoutY="40.0"
        text="Hello" />

</AnchorPane>

Nazwa zmiennej w kodzie javy odpowiada nazwie identyfikatora w pliku .fxml. Możemy teraz wpływać na tekst po naciśnięciu przycisku.


import javafx.fxml.FXML;
import javafx.scene.text.Text;

public class MainController {

    @FXML
    private Text mainText;

    @FXML
    private void onButtonClick() {
        mainText.setText("World!");
    }
}
Zadanie 3

Zmodyfikuj kod tak, aby program wymieniał napis "Hello" na "World", a po ponownym naciśnięciu z powrotem na "Hello".

Zadanie 4

Napisz aplikację, która pobierze od użytkownika 2 liczby, a potem wyświetli ich sumę.

Zadanie 5

Napisz aplikację, która umieści w ScrollPane 1000 przycisków.

Zadanie 6

Spraw, aby naciskając przycisk, program zmieniał klasę CSS tekstu tak, aby tekst raz był czerwony, raz niebieski. (Podpowiedź: element przechowuje listę aktywnych klas css w liście dostępnej pod metodą getStyleClass()).