Нет, вы не хотите делать несколько сцен. Одной из основных концепций JavaFX (и Java в целом, а также других объектно-ориентированных языков программирования) является DRY кодирование: D on't R epeat Y , себя.
Повторно используйте столько кода, сколько сможете. Таким образом, вы должны создать только одну сцену и обновлять ее элементы интерфейса по мере необходимости.
Вот очень простой пример, который использует FXML
для построения Scene
с отображением одного Label
. Обратите внимание, что Label
- это то, что известно как Node
, а Node
может фактически быть любым визуальным элементом, будь то Label
, или изображение, или любой другой элемент, отображаемый на экране.
Так что, хотя в этом примере используется Label
, при использовании изображения вместо этого используется та же концепция.
Main.java
Этот класс используется просто для загрузки нашего файла FXML и запуска приложения.
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Layout.fxml"));
primaryStage.setScene(new Scene(loader.load()));
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Layout.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<VBox xmlns="http://javafx.com/javafx"
alignment="CENTER"
spacing="10"
xmlns:fx="http://javafx.com/fxml"
fx:controller="drySample.LayoutController"
prefHeight="200.0" prefWidth="200.0">
<!-- Let's display a simple Label and Button -->
<Label fx:id="label" text="This is the initial text!"/>
<Button fx:id="button" text="Change Text"/>
</VBox>
LayoutController.java
«Контроллер» - это термин, используемый для описания класса, который содержит логику, используемую для определения поведения элементов пользовательского интерфейса в файле FXML.
Здесь мы просто хотим, чтобы наш Button
изменил существующий элемент пользовательского интерфейса (в данном случае текст отображается в Label
.
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
public class LayoutController {
// By using the @FXML annotation, we tell JavaFX that these nodes are already defined in the FXML file this
// controller ... controls.
@FXML
private Label label;
@FXML
private Button button;
@FXML
private void initialize() {
// Now we have access to both our label and button that are defined in our FXML scene
// Let's set the action of the button to change the text of the Label
button.setOnAction(event -> {
// These types of actions can also be used to change an image or a myriad of other things.
label.setText("You changed the text!");
});
}
}
Если вы запустите это приложение, вы увидите следующий интерфейс:
После нажатия кнопки Change Text
текст над ней изменится на «Вы изменили текст!»
Таким образом, вы можете разработать макет интерфейса в соответствии с вашими потребностями и обновить информацию, отображаемую в этом макете.