fxml

interfacce grafiche definite tramite file xml

A volte è necessario costruire applicazioni con delle interfacce complicate e scrivere tutto il codice che riguarda la finestra manualmente potrebbe essere noioso...

La prima versione crea gli oggetti da programma.

La seconda versione usa invece fxml.

File: NomeCognome.java

package it.aspix.librojava.fxml;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class NomeCognomeClassico extends Application{
public class NomeCognomeFxml extends Application{

	TextField campoNome = new TextField();
	TextField campoCognome = new TextField();
	Label risposta = new Label("-");@FXML TextField campoNome;
	@FXML TextField campoCognome;
	@FXML Label risposta;
	
	@Override
	public void start(Stage palcoPrincipale){
		Label etichettaNome = new Label("nome:");
		Label etichettaCognome = new Label("cognome:");
		Button combina = new Button("combina nome e cognome");
		GridPane pannelloPrincipale = new GridPane();
		
		pannelloPrincipale.add(etichettaNome, 0, 0);
		pannelloPrincipale.add(campoNome, 1, 0);
		pannelloPrincipale.add(etichettaCognome, 0, 1);
		pannelloPrincipale.add(campoCognome, 1, 1);
		pannelloPrincipale.add(combina, 0, 2, 2, 1);
		pannelloPrincipale.add(risposta, 0, 3, 2, 1);
		
		// alcune sistemazioni estetiche
		pannelloPrincipale.setHgap(5);
		pannelloPrincipale.setVgap(5);
		pannelloPrincipale.setPadding(new Insets(10));
		combina.setMaxWidth(Double.MAX_VALUE);
		pannelloPrincipale.setId("sfondo");
		
		combina.setOnAction( e->gestioneClickPulsante(e)  );
		
		Scene scena = new Scene(pannelloPrincipale);
		Scene scena = new Scene( FXMLLoader.load(NomeCognomeFxml.class.getResource("NomeCognomePannello.fxml")) );
		palcoPrincipale.setScene(scena);
		palcoPrincipale.setTitle("Nome + Cognome");
		scena.getStylesheets().add("it/aspix/librojava/fxml/stili.css");
		palcoPrincipale.show();
	}
	
	public static void main(String args[]){
		launch(args);
	}
	
	@FXML
	private void gestioneClickPulsante(ActionEvent e){
		String combinato;
		combinato = campoNome.getText()+" "+campoCognome.getText();
		risposta.setText(combinato);
	}
}

File: NomeCognomePannello.fxml

Questo file non deve essere scritto manualmente: può essere costruito usando un apposito programma chiamato SceneBuilder.

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>

<GridPane id="sfondo" hgap="5.0" stylesheets="@stili.css" vgap="5.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="it.aspix.librojava.fxml.NomeCognome">
   <children>
      <Label text="nome:" />
      <Label text="cognome:" GridPane.rowIndex="1" />
      <TextField fx:id="campoNome" GridPane.columnIndex="1" />
      <TextField fx:id="campoCognome" GridPane.columnIndex="1" GridPane.rowIndex="1" />
      <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#gestioneClickPulsante" text="combina nome e cognome" GridPane.columnSpan="2" GridPane.rowIndex="2" />
      <Label fx:id="risposta" text="-" GridPane.columnSpan="2" GridPane.rowIndex="3" />
   </children>
   <padding>
      <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
   </padding>
</GridPane>

File: stili.css

.label {
	-fx-text-fill: yellow;
}

#sfondo {
	-fx-background-color: black;
}