Organização das Pastas
O programa MyShapes e propriedades do MyShapes utiliza apenas o código JavaFX para construir elementos visuais do programa. Uma abordagem alternativa é declarar esses elementos visuais com FXML, uma anotação baseada no XML. FXML deixa você descrever e configurar seu scene graph no formato declarativo. Essa abordagem tem várias vantagens:
- A estrutura hierárquica do FXML, é mais bem refletido na estrutura do seu scene graph.
- FXML descreve seu view e suporta a arquitetura Model-View-Controller (MVC), fornecendo melhor estrutura para grandes aplicações.
- FXML reduz o código JavaFX e configura scene graph nodes.
- Você pode modelar seu UI com Scene Builder. Essa ferramenta de arrasta e solta é uma aplicação que fornece uma renderização de sua scene. E a Scene Builder gera a marcação FXML.
- Você pode editar a marcação FXML com um editor de texto ou uma IDE.
FXML afeta a estrutura de seu programa. A classe principal da classe invoca um FXMLLoader. Esse loader analisa sua marcação FXML, e cria objetos JavaFX, e insere a scene graph dentro da scene que está no node root.
Você pode ter múltiplos arquivos FXML, e tipicamente cada um tem uma classe controller JavaFX correspondente. Esse controller pode incluir eventos manipuladores ou outras declarações que dinamicamente atualizam a scene. O controller também inclui a camada de lógica de negócios que manipula uma específica view.
Reorganize o seu projeto MyShapes de maneira que as pastas fiquem nessa formação.
O código do JavaFX está no subdiretório java. O subdiretório resources contêm os arquivos FXML e CSS (Scene.fxml e Style.css). Esse programa inclui uma rotação StackPane, controle VBox e um segundo objeto Text.
O arquivo Scene.FXML descreve nosso scene graph: um top-level VBox que inclui um elemento StackPane e Text. O StackPane inclui a Ellipse e o Text.
Scene.FXML
1 |
<em><?</em>xml version="1.0" encoding="UTF-8"<em>?><br></em><em><br></em><em><?</em>import javafx.scene.effect.DropShadow<em>?><br></em><em><?</em>import javafx.scene.effect.Reflection<em>?><br></em><em><?</em>import javafx.scene.layout.StackPane<em>?><br></em><em><?</em>import javafx.scene.layout.VBox<em>?><br></em><em><?</em>import javafx.scene.paint.LinearGradient<em>?><br></em><em><?</em>import javafx.scene.paint.Stop<em>?><br></em><em><?</em>import javafx.scene.shape.Ellipse<em>?><br></em><em><?</em>import javafx.scene.text.Font<em>?><br></em><em><?</em>import javafx.scene.text.Text<em>?><br></em><em><br></em><VBox alignment="CENTER" prefHeight="350.0" prefWidth="350.0" spacing="50.0"<br> xmlns="http://javafx.com/javafx/10.0.1"<br> xmlns:fx="http://javafx.com/fxml/1 fx"<br> fx:controller="main.java.br.com.cursojavanow.FXMLController" ><br><br> <children><br> <StackPane fx:id="stackPane" onMouseClicked="#handleMouseClick"<br> prefHeight="150.0" prefWidth="200.0"><br> <children><br> <Ellipse radiusX="110.0" radiusY="70.0"><br> <fill><br> <LinearGradient endX="0.5" endY="1.0" startX="0.5"><br> <stops><br> <Stop color="DODGERBLUE" /><br> <Stop color="LIGHTBLUE" offset="0.5" /><br> <Stop color="LIGHTGREEN" offset="1.0" /><br> </stops><br> </LinearGradient><br> </fill><br> <effect><br> <DropShadow color="GREY" offsetX="5.0"<br> offsetY="5.0" /><br> </effect><br> </Ellipse><br> <Text text="My Shapes"><br> <font><br> <Font name="Arial Bold" size="24.0" /><br> </font><br> <effect><br> <Reflection fraction="0.8" topOffset="1.0" /><br> </effect><br> </Text><br> </children><br> </StackPane><br> <Text fx:id="text2" text="Animation Status: "><br> <font><br> <Font name="Arial Bold" size="18.0" /><br> </font><br> </Text><br> </children><br></VBox> |
O container top-level inclui o nome da classe controller JavaFX com o atributo fx:controller. O VBox especifica alinhamento, preferência de tamanhos e espaçamento entre seguido dos seus filhos: o StackPane e Text.
No StackPane, nós configuramos as dimensões do StackPane. Um atributo especial fx:id especifica uma variável para o node correspondente. Na classe controller JavaFX, você irá ver o nome dessa variável anotada com @FXML para o StackPane. Assim que o objeto é acessado na classe controller que está declarada no arquivo FXML.
Além disso, StackPane especificas um onMouseClicked event handler chamado #handleMousClick. Esse event handler é também anotado com @FXML na classe controller JavaFX.
Os filhos do StackPane, Ellipse e Text, estão declarados dentro do node Children FXML. Não tem associação ao atributo fx:id, desde que a classe controller não precisa acessar esses objetos. Temos as configurações linear gradient, drop shadow e reflection effect.
Veja que o objeto Text com fx:id “text2” aparece depois da definição do StackPane. Esse segundo Text está abaixo do StackPane dentro do VBox. Foi também especificado um atributo fx:id para acessar esse node a partir do controller JavaFX.
Fonte: The Definitive Guide to Modern Java Clients with JavaFX
Deixe um comentário