Criamos elipse e text nodes, mas ainda não criarmos um scene. Antes de nos criarmos o scene, precisamos colocar esses nodes dentro de algum container layout.
Layout são controles extremamente importantes para manipular nossa scene. Esses controles não apenas ordenam componentes para você, eles se adaptam ao tamanho do layout, a adição ou remoção de elementos, e qualquer mudança de tamanho em um ou mais nodes da scene.
Para mostrar a você como o controle do layout é importante, vamos substituir no código MyShapes o componente StackPane por Group. Group é um node pai que tem vários filhos, mas não fornece nenhum recurso de layout.
Vamos criar um grupo e adicionar a elipse e os elementos de texto no construtor. Vai ficar assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
package sample; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.shape.Ellipse; import javafx.scene.text.Font; import javafx.scene.text.Text; import javafx.stage.Stage; public class MyShapes extends Application { @Override public void start(Stage stage) throws Exception { Ellipse ellipse = new Ellipse(110, 70); ellipse.setFill(Color.LIGHTBLUE); Text text = new Text("Minhas Formas"); text.setFont(new Font("Arial Bold", 24)); //StackPane stackPane = new StackPane(); //stackPane.getChildren().addAll(ellipse, text); Group group = new Group(ellipse, text); Scene scene = new Scene(group, 350, 230, Color.LIGHTYELLOW); stage.setTitle("Minhas Formas com JavaFX"); stage.setScene(scene); stage.show(); } public static void main(String[] args){ launch(args); } } |
Group utiliza padrões de alinhamento para seus filhos e tudo começa em (0,0), que é o lado superior esquerdo. A localização padrão para Text é lado inferior esquerdo. Com essa configuração só veremos parte da elipse.
Isso claramente não é o que queremos. Para consertar isso, podemos fazer algumas modificações.
1 2 3 4 5 6 7 8 |
... Group group = new Group(ellipse, text); ellipse.setCenterX(175); ellipse.setCenterY(115); text.setX(175-(text.getLayoutBounds().getWidth()/2)); text.setY(115+(text.getLayoutBounds().getHeight()/2)); ... |
Agora ficou certo, só que se você mudar o tamanho da janela a elipse não irá se adaptar ao tamanho, ela ficará presa na coordenada que adicionamos.
Você pode programar a parte de detecção de tamanho da tela e ajustar a elipse no meio da janela. Mas para que fazer isso? Se já tem os layouts de controle que faz isso.
Deixe um comentário