Для создания сложной, которая используется для обработки событий элементов управления, лучше определять классы контроллеров, как было показано в прошлой теме. Однако в каких-то простых случаях можно несколько упростить организацию приложения и определить обработчики прямо в FXML, не создавая отдельного класса контроллера.
Например, определим в FXML следующий интерфейс:
<?xml version="1.0" encoding="UTF-8"?> <?language JavaScript?> <?import java.lang.*?> <?import javafx.scene.Group?> <?import javafx.scene.control.Button?> <Group fx:id="root" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/fxml/2.2"> <Button text="Click!" onAction="pressButton()" fx:id="btn" prefWidth="60" /> <fx:script> var x = 0; function pressButton() { x++; btn.setText(x) } </fx:script> </Group>
Фактически такой способ работы с FXML напоминает работу с веб-страницей, которая содержит код javascript. И чтобы в FXML это тоже было возможно, вначало файла помещается следующая декларация:
<?language JavaScript?>
Но чтобы элемент language стал доступен, в корневом узле подключается пространство имен xmlns="http://javafx.com/fxml/2.2"
. Причем данное
пространство имен указывается для атрибута xmlns, поэтому к его возможностям можно обращаться без префикса.
В конце файла определяется элемент fx:script
, который содержит логику обработки. Здесь определяются переменная x, которая хранит счетчик нажатий,
и функция pressButton, которая будет вызываться при нажатии на кнопку.
В скрипте мы можем обращаться к элементам FXML по их id и соответственно вызывать их методы. Как в случае с кнопкой устанавливается ее текст.
Для прикрепления функции pressButton в качестве обработчика события к кнопке, вызов этой функции присваивается атрибуту onAction:
onAction="pressButton()"
Стоит обратить внимание, что это отличается от установки ссылки на метод контроллера. То есть в данном случае перед именем функции не ставится знак решетки и после имени идут скобки, которые представляют вызов функции.
При запуске приложения мы сможем нажимать на кнопку и тем самым увеличивать счетчик нажатий: