FXML tutorial (7) – właściwości domyślne
Niektóre klasy dziedziczące po Node
niektóre właściwości mają oznaczane adnotacją @DefaultProperty
na przykład @DefaultProperty(value="children")
. Taka właściwość staje się domyślna i w kodzie FXML może być pominięta, co upraszcza pisanie kodu.
Plik but07.css
.button{ -fx-font-size: 18px; } .small-button{ -fx-font-size: 15px; -fx-color:red; } #but2 { -fx-font-size: 21px; }
Plik listing07_default_property.fxml
<?xml version="1.0" encoding="UTF-8"?> <?language groovy?> <?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.HBox?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.Button?> <?import java.net.URL?> <VBox xmlns:fx="http://javafx.com/fxml"> <stylesheets> <URL value="@but07.css" /> </stylesheets> <children> <Label fx:id="lab1" text="Twoja decyzja?" /> <HBox fx:id="hbox"> <children> <Button fx:id="but1" text="Tak" onAction="showText1();" /> <Button fx:id="but2" onAction="showText2()"> <text>Nie</text> </Button> <Button styleClass="small-button" fx:id="but3" text="Anuluj" onAction="showText3()" /> </children> </HBox> </children> <fx:script> def showText1() { lab1.setText("Wybrałeś 'Tak'") } def showText2() { lab1.setText("Wybrałeś 'Nie'") } def showText3() { lab1.setText("Wybrałeś 'Anuluj'") } </fx:script> </VBox>
Właściwość <children> jest domyślna i może być pominięta.
Jednocześnie pokazane jest, że właściwości na przykład text
w przyciskach może być ustawiana albo jako atrybut text="Tak"
albo jako właściwość <text>Nie</text>
. Wszystkie wartości atrybutów są zapisywane jako tekst. Jeśli odnoszą się do miar ilości, długości czy liczb, na przykład składników koloru, muszą być konwertowane na odpowiednie obiekty Java. Jeśli istnieją automatyczne konwertery, właściwość możemy ustawić zarówno jako atrybut jak i element, natomiast jeśli klasy konwertującej nie ma, musimy właściwość ustawić jako element.
Konwertery są umieszczone w pakiecie javafx.util.converter
.
Klasa Listing07_default_property.java
package codes; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.net.URL; public class Listing07_default_property extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { try { URL fxmlUrl = this.getClass().getClassLoader() .getResource("resources/listing07_default_property.fxml"); VBox root = fxmlUrl != null ? FXMLLoader.load(fxmlUrl) : new VBox(); Scene scene = new Scene(root, 200, 100); stage.setScene(scene); stage.show(); } catch (Exception e) { e.printStackTrace(); } } }
Po uruchomieniu kodu zobaczymy: