Tutorial JavaFX: layouts básicos

Tradução do Tutorial do JavaFX: artigo de layouts básicos de Vojtech Ruzicka.

Como organizar e hospedar componentes da GUI em um aplicativo JavaFX.

Este é o quarto artigo da série JavaFX. Em um artigo anterior, descrevi como usar o FXML e o SceneBuilder para criar sua interface de usuário. Agora olhamos para os layouts.

Todas as postagens na série JavaFX:

  1. Tutorial JavaFX: Introdução
  2. Tutorial JavaFX: Olá, mundo!
  3. Tutorial JavaFX: FXML e SceneBuilder
  4. Tutorial JavaFX: layouts básicos
  5. Tutorial JavaFX: layouts avançados
  6. Tutorial JavaFX: estilo CSS
  7. JavaFX Weaver: Integrando aplicativos JavaFX e Spring Boot

Layouts


O layout é um contêiner para componentes. Os layouts são úteis, pois você pode posicionar esse contêiner como um todo, independentemente dos componentes. Além disso, cada cena pode conter apenas um componente; portanto, você precisa de um layout como componente raiz da sua cena, para poder colocar todos os componentes necessários da cena. Obviamente, um layout geralmente não é suficiente, mas você pode colocar um layout dentro de outro.

Além disso, os layouts também organizam e colocam seus componentes dentro de si. Dependendo do layout usado, os componentes filhos podem estar localizados:

  • Um por um horizontalmente
  • Um por um verticalmente
  • Empilhados uns sobre os outros
  • Na grade

Existem muitas mais opções. O importante é que o layout atualize automaticamente a posição de seus filhos quando for redimensionado. Assim, você pode ter um layout consistente, mesmo quando o usuário redimensiona a janela do aplicativo.

HBox


Este é um dos modelos mais fáceis disponíveis. Ele simplesmente coloca todos os objetos horizontalmente em uma fileira, um após o outro, da esquerda para a direita.



No FXML, você pode usar o HBox da seguinte maneira:

<HBox> <Button>1</Button> <Button>2</Button> <Button>3</Button> <Button>4</Button> </HBox> 

Em Java, você pode usar este código:

 HBox hbox = new HBox(); Button btn1 = new Button("1"); Button btn2 = new Button("2"); Button btn3 = new Button("3"); Button btn4 = new Button("4"); hbox.getChildren().addAll(btn1, btn2, btn3, btn4); 

Espaçamento


Nossos elementos agora estão organizados ordenadamente, um após o outro:



No entanto, essa opção não é muito boa, pois os elementos são dispostos um após o outro sem espaços. Felizmente, podemos determinar o espaçamento entre componentes usando a propriedade espaçamento HBacing:

 <HBox spacing="10"> ... </HBox> 

Ou em Java usando setSpacing () :

 HBox hbox = new HBox(); hbox.setSpacing(10); 

Padding


Os elementos agora estão posicionados corretamente, no entanto, ainda não há recuo entre os elementos e a própria HBox. Pode ser útil adicionar preenchimento à nossa HBox:



Você pode especificar cada área a ser preenchida separadamente - superior, inferior, esquerda e direita.

 <HBox> <padding> <Insets top="10" bottom="10" left="10" right="10"/> </padding> ... </HBox> 

O mesmo pode ser feito em Java:

 HBox hbox = new HBox(); hbox.setPadding(new Insets(10, 10, 10, 10)); 

Vbox


O VBox é muito semelhante ao HBox, mas, em vez de exibir componentes internos horizontalmente, um após o outro, ele os exibe verticalmente em uma coluna:



Você ainda pode definir as propriedades de espaçamento e preenchimento da mesma maneira que na HBox.

O código VBox é usado exatamente da mesma maneira que a HBox, apenas o nome é diferente:

 <VBox spacing="10"> <padding> <Insets top="10" bottom="10" left="10" right="10"/> </padding> <Button>1</Button> <Button>2</Button> <Button>3</Button> <Button>4</Button> </VBox> 

E em Java:

 VBox vbox = new VBox(); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.setSpacing(10); Button btn1 = new Button("1"); Button btn2 = new Button("2"); Button btn3 = new Button("3"); Button btn4 = new Button("4"); vbox.getChildren().addAll(btn1, btn2, btn3, btn4); 

Stackpan


Esse layout é útil para colocar seus componentes uns sobre os outros. A ordem de inserção determina a ordem dos elementos. Isso significa que o primeiro elemento está na parte inferior, o próximo está na parte superior e assim por diante.

Isso pode ser útil, por exemplo, para mostrar uma imagem no layout e exibir algum texto ou botão sobre ela.



O exemplo a seguir usa o StackPane no FXML:

 <StackPane> <ImageView> <Image url="/image.jpg"/> </ImageView> <Button>Click Me!</Button> </StackPane> 

O mesmo exemplo em Java:

 StackPane stackPane = new StackPane(); Image image = new Image(getClass().getResourceAsStream("/image.jpg")); ImageView imageView = new ImageView(image); Button btn = new Button("Click Me!"); stackPane.getChildren().addAll(imageView, btn); 

Alinhar elementos


Você pode definir o alinhamento dos elementos na pilha para organizar melhor sua organização:

 <StackPane alignment="BOTTOM_CENTER"> ... </StackPane> 

Claro que você pode fazer o mesmo em Java:

 StackPane stackPane = new StackPane(); stackPane.setAlignment(Pos.BOTTOM_CENTER); 

Margem


Se você deseja controlar ainda mais a organização dos elementos com mais detalhes, é possível definir margens para elementos individuais na pilha:

 <StackPane alignment="BOTTOM_CENTER"> <ImageView> <Image url="/image.jpg"/> </ImageView> <Button> <StackPane.margin> <Insets bottom="10"/> </StackPane.margin> Click Me! </Button> </StackPane> 

Ou em Java:

 StackPane stackPane = new StackPane(); Button btn = new Button("Click Me!"); stackPane.getChildren().add(btn); StackPane.setMargin(btn, new Insets(0,0,10,0)); 

Flowpan


O painel Fluxo pode funcionar em dois modos - horizontal (padrão) ou vertical.

No modo horizontal, os itens são exibidos horizontalmente, um após o outro, como na HBox. A diferença é que, quando não há mais espaço horizontal, ele é transferido para a próxima linha abaixo da primeira e continua novamente. Assim, pode haver muitas linhas, e não apenas uma, como na HBox.

O modo vertical é muito semelhante, mas (como o VBox) exibe elementos verticalmente, de cima para baixo. Quando não há mais espaço, ele adiciona outra coluna e continua.

A figura a seguir ilustra esses dois modos:



Observe que os elementos não precisam ter o mesmo tamanho da imagem acima.

Observe como a posição dos componentes é recalculada se você redimensionar o contêiner:



Você pode definir o preenchimento interno desse layout da mesma maneira que para HBox e VBox. No entanto, o uso da propriedade espaçamento é um pouco diferente. Em vez de uma única propriedade para espaçamento, você precisa ter propriedades de espaçamento horizontal e vertical separadas, pois os elementos podem ser exibidos em várias linhas / colunas. Use hgap para a propriedade espaçamento horizontal e vgap para a propriedade vertical.

 FlowPane flowPane = new FlowPane(); flowPane.setOrientation(Orientation.VERTICAL); flowPane.setVgap(10); flowPane.setHgap(10); flowPane.getChildren().addAll(...); 

Exemplo do FlowPane no FXML:

 <FlowPane hgap="10" vgap="10" orientation="VERTICAL"> ... </FlowPane> 

Tilepan


Esse layout é muito semelhante ao FlowPane. Sua maneira de exibir componentes é quase idêntica. Você ainda pode usar o modo horizontal ou vertical e definir vgap e hgap .

Uma diferença importante é o tamanho das células. O FlowPane atribui apenas o espaço necessário para cada componente. O TilePane, por outro lado, torna o tamanho de todas as células iguais, dependendo do maior elemento. Assim, todos os controles estão bem alinhados em linhas / colunas.



Na imagem acima, os mesmos componentes são colocados da mesma maneira, mas você pode notar facilmente a diferença.

O FlowPane coloca os controles um após o outro, sem intervalos extras
TilePane coloca controles em células do mesmo tamanho com base no maior elemento.

A criação do TilePane não é diferente do FlowPane, exceto pelo nome.

 <TilePane vgap="10" hgap="10" orientation="VERTICAL" > 

A mesma coisa em Java:

 TilePane tilePane = new TilePane(); tilePane.setVgap(10); tilePane.setHgap(10); tilePane.setOrientation(Orientation.VERTICAL); 

O que vem a seguir


O artigo examinou o uso de vários layouts básicos para colocar componentes em um aplicativo JavaFX. De fato, o JavaFX possui uma seleção muito mais diversificada de layouts. Opções avançadas de layout serão discutidas no próximo artigo.

Source: https://habr.com/ru/post/pt475882/


All Articles