FXML

Определение интерфейса в FXML

Последнее обновление: 01.10.2018

Для упрощения организации и работы с интерфейсом в JavaFX может использоваться язык разметки FXML, который создан на основе XML. FXML позволяет определить интерфейс приложения декларативным способом подобно тому, как веб-страницы определяются с помощью HTML.

Например, определим в папке, где находится файл с основным классом программы (допустим, это файл Main.java), новый файл, который назовем Main.fxml и в котором определим следующее содержимое:

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

<?import java.lang.*?>
<?import javafx.scene.control.Button?>
<Button xmlns:fx="http://javafx.com/fxml/1" text="Hello FXML" />

Этот файл может напоминать html- или xml-файл, где каждый элемент заключен в угловые скобки.

Файл начинается с декларации xml, которая указвает используемую версию xml и кодировку.

Затем идут подключаемые классы и пакеты. Подобно тому, как в файлах java перед использованием классов нам надо указывать их пакеты с помощью выражений типа:

import javafx.scene.*;
import javafx.scene.control.Button;

Так и в файле fxml точно также импортируем пакеты или отдельные классы:

<?import java.lang.*?>
<?import javafx.scene.control.Button?>

В первом выражении импорта подключаются все классы из пакета java.lang, а второе выражение подключает класс javafx.scene.control.Button. Если мы не подключим нужные нам классы, то соответственно не сможем их использовать в FXML.

После выражений импорта определяется собственно графический интерфейс. В данном случае у нас определена одна кнопка. Поскольку кнопка представляет класс Button, то соответственно элемент также называется Button. То есть между назваиями элементов и классов есть соответствие по имени. Фактически тем самым мы создаем объект класса Button.

С помощью атрибутов элемента Button мы можем установить свойства создаваемого объекта Button.

<Button text="Hello FXML" />

Здесь используется только один атрибут text, который который устанавливает свойство text, то есть текст кнопки. Как правило, атрибуты соответствуют свойствам классов по имени. Все свойства всех классов можно посмотреть в документации.

Теперь изменим основной класс программы, который будет использовать файл FXML:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;

public class Main extends Application{
	
	public static void main(String[] args) {
        
		Application.launch(args);
    }
	
	@Override
    public void start(Stage stage) throws Exception {
		
		Parent root = FXMLLoader.load(getClass().getResource("Main.fxml")); 
		Scene scene = new Scene(root);
		
		stage.setScene(scene);
		
        stage.setTitle("Hello JavaFX");
		stage.setWidth(250);
		stage.setHeight(200);
		
        stage.show();
	}
}

Для создания интерфейса из файла fxml применяется метод FXMLLoader.load(). Чтобы получить определение интерфейса из файла, используется метод getClass().getResource("Main.fxml").

Метод FXMLLoader.load() возвращает объект типа Parent, который мы можем передать в конструктор объекта Scene, и таким образом, наше приложение получит интерфейс из fxml.

При компиляции и запуске приложения, которое применяет fxml-файлы, необходимо использовать модуль javafx.fxml. В частности, параметры компиляции и запуска будут выглядеть следующим образом:

Компиляция FXML в JavaFX

В итоге мы получим следующее окно приложения:

FXML в JavaFX

Таким образом, мы можем отделить определение интерфейса от программной логики. Еще одним преимуществом FXML является то, что мы можем изменить определение файла fxml без перекомпиляции приложения. Например, чуть усложним файл Main.fxml:

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

<?import java.lang.*?>
<?import javafx.scene.Group?>
<?import javafx.scene.control.Button?>
<Group>
    <Button text="Hello JavaFX!" />
</Group>

Теперь мы поместили кнопку в контейнер Group. При этом ничего не надо перекомпилировать. Достаточно перезапустить приложение, и мы увидим другой результат:

Определение интерфейса FXML в JavaFX
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850