Есть условное изображение для отображения в SceneBuilder - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь найти способ сделать так, чтобы определенная сцена отображалась одинаково, но определенная внешняя переменная будет влиять на то, какое изображение отображается.Есть ли способ сделать это или я должен сделать несколько сцен с разными изображениями в них?

1 Ответ

0 голосов
/ 10 июня 2019

Нет, вы не хотите делать несколько сцен. Одной из основных концепций 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!");
        });

    }
}

Если вы запустите это приложение, вы увидите следующий интерфейс:

screenshot

После нажатия кнопки Change Text текст над ней изменится на «Вы изменили текст!»


Таким образом, вы можете разработать макет интерфейса в соответствии с вашими потребностями и обновить информацию, отображаемую в этом макете.

...