Нужно ли знать XML, чтобы уметь работать с JavaFX?
Я решил изучить JavaFX, когда я создал свой первый проект, меня заинтересовал файл с разрешением .fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Button?>
<VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.demo3.HelloController">
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
</padding>
<Label fx:id="welcomeText"/>
<Button text="Hello!" onAction="#onHelloButtonClick"/>
</VBox>
Я так понимаю - это код на XML. После этого я задался вопросом - нужно ли знать XML, чтобы уметь работать с JavaFX?
Ответы (2 шт):
Автор решения: denis0001-dev
→ Ссылка
И нет, и да. В JavaFX есть два способа создать интерфейс:
- с помощью файла с расширением
.fxml
:
// Главный класс (допустим com.example.HelloApplication)
package com.example;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
public class HelloApplication extends Application {
@Override
public void start(@NotNull Stage stage) throws IOException {
// загрузить FXML файл
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 320, 240);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
// Контроллер (com.example.HelloController)
package com.example;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
public class HelloController {
@FXML
private Label welcomeText;
@FXML
protected void onHelloButtonClick() {
welcomeText.setText("Welcome to JavaFX Application!");
}
}
<!-- FXML файл (в ресурсах: {имя пакета, в нашем случае com.example}/hello-view.fxml -->
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml"
fx:controller="ru.morozovit.shellide.HelloController">
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
</padding>
<Label fx:id="welcomeText"/>
<Button text="Hello!" onAction="#onHelloButtonClick"/>
</VBox>
- с помощью Java:
// Главный класс
package com.example;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.jetbrains.annotations.NotNull;
public class HelloApplication extends Application {
@Override
public void start(@NotNull Stage stage) {
// Корневой контейнер
VBox vbox = new VBox();
// Настройки
vbox.setAlignment(Pos.CENTER);
vbox.setSpacing(20.0);
vbox.setPadding(new Insets(20.0, 20.0, 20.0, 20.0));
Label welcomeText = new Label();
Button button = new Button();
button.setText("Hello!");
button.setOnAction((_) -> welcomeText.setText("Welcome to JavaFX Application!"));
// Добавим все элементы в контейнер
vbox.getChildren().add(welcomeText);
vbox.getChildren().add(button);
// Вместо FXMLLoader мы используем корневой контейнер
Scene scene = new Scene(vbox, 320, 240);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
Лучше всего знать оба метода, но вы можете использовать какой вам нравится.
Автор решения: Foge
→ Ссылка
Не обязательно, ведь можно использовать Scene Builder - это отдельная программа, позволяющая собрать fxml практически полностью используя только мышь