Разделение класса контроллера JavaFX - PullRequest
0 голосов
/ 17 сентября 2018

У меня нет примера кода MCV, потому что проблема более глобальная, и я не думаю, что конкретный код действительно имеет большое значение.

У меня есть приложение с графическим интерфейсом с несколькими элементами (датчики, выпадающие списки, поля ввода, планшетное представление) и в соответствии с JavaFX один ControllerClass, который стал довольно большим со временем.

Следовательно, я искал способ разделить его.В своем исследовании я нашел два основных способа сделать это:

Получение большей части логики программы из части пользовательского интерфейса, что, конечно, всегда имеет смысл, и я сделал это для некоторых частей, но для многих это кажется довольнонеудобно, например, если у меня есть функция, которая использует шесть различных элементов GUI, кажется странным извлекать этот метод из класса контроллера, поскольку мне нужно дать ему все эти ссылки на элементы GUI в вызове функции.Есть ли какой-то лучший способ, по которому я скучаю?Как заполнение класса контроллера просто с помощью сеттеров / геттеров и предоставление каждому методу this в качестве параметра, чтобы он мог идти this.dropbox1?

Вторым способом, который я нашел, было разделение самого GUI на несколько сцен.Как и этот вопрос, но я понятия не имею, как разбить один графический интерфейс на несколько сцен и все еще иметь его в одном окне.Я понимаю, что вы можете загрузить другие файлы FXML в свой файл main-FXML, но я не уверен, как объединить их в графический интерфейс в одном окне.Если бы у кого-нибудь был небольшой пример кода для этого, я был бы благодарен.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Если вы используете FXML, простая вещь - это иметь контроллер для FXML (один к одному). И лично я также добавляю css, это своего рода шаблон.

Затем вам нужно разделить вашЭкран небольшими частями: 2 метода:

  • с использованием fx: include: вы включаете FXML, который сам объявляет контроллер
  • с использованием компонента: вы включаете тег вашего компонента, который сам по себеможет загружать FXML и контроллер)

    При использовании fx: include вы также можете использовать «вложенный контроллер» для получения ссылки на дочерний контроллер от своего родителя.

    Последними вашими объектами могут быть bean-компоненты javaFX с наблюдаемыми, иВы только выставляете наблюдаемые и не визуальные компоненты от контроллера к другому: таким образом у вас есть слабая связь между вашими компонентами.

0 голосов
/ 18 сентября 2018

Добро пожаловать в Stackoverflow Labib, относительно разделения:

У вас может быть корневой FXML, который содержит, например, только GridPane (или что-то еще, но я продолжу на предпосылке GridPane), теперь вынастройте Grid (без содержимого) в этом корневом файле FXML. Если у вас уже есть готовый графический интерфейс, у вас должно быть четкое представление о том, насколько крупными должны быть ячейки сетки.В вашем основном классе у вас есть:

Основной класс, который расширяет приложение и запускает GUI

public class GUI extends Application {

    private Stage stage;
    private GridPane rootGrid;

    @Override
    public void start(Stage stage) {

        this.stage = stage;

        // Load root layout from fxml file.
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(WindowRoot.class.getResource("RootGrid.fxml"));
        rootGrid = (GridPane) loader.load();

        // Show the scene containing the root layout.
        Scene scene = new Scene(rootGrid);
        stage.setTitle("Test");
        stage.show();
        //fill the Grid
        setupGrid();
    }

Теперь у вас есть rootGrid в качестве атрибута класса, который является простоСетка с пустыми строками / столбцами, заданными в RootGrid.fxml, может быть простой:

Пример FXML, две строки, два столбца, без содержимого

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

<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>


<GridPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.141">
   <rowConstraints>
      <RowConstraints minHeight="10.0" prefHeight="30.0" />
      <RowConstraints minHeight="10.0" prefHeight="30.0" />
   </rowConstraints>
   <columnConstraints>
      <ColumnConstraints minWidth="10.0" prefWidth="100.0" />
      <ColumnConstraints minWidth="10.0" prefWidth="100.0" />
   </columnConstraints>
</GridPane>

Теперь вы создаете документы FXML для каждой ячейки, которую хотите заполнить, и в этом FXML у вас есть одна AnchorPane с содержимым этой ячейки.Затем вы добавляете его в Grid как часть метода start.Допустим, вы хотите в этом простом примере меню.Создайте FXML для меню:

пример простого меню fxml:

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

<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.141">
   <children>
      <MenuBar>
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
              <MenuItem mnemonicParsing="false" text="Close" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
   </children>
</AnchorPane>

И добавьте его в сетку как часть метода start (но, вероятно,Извлеките его в метод, который вы вызываете при запуске, например setupGrid():

Настройка Grid, вызываемой при запуске (стадия)

private void setupGrid() {
    // Add Menubar
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(WindowRoot.class.getResource("menubar.fxml"));
    AnchorPane anchor = (AnchorPane) loader.load();
    //put it in first column, first row
    GridPane.setConstraints(anchor, 0, 0);
    //optional, let it span both/all columns
    GridPane.setRowSpan(anchor, 2);
    rootGrid.getChildren().add(anchor);

You 'Вам нужно будет попробовать / исключить блоки ввода-вывода, оставив их для лучшей читабельности. Для других «корневых панелей» вам понадобятся другие методы настройки, например для borderPane, у вас будут такие вещи, как rootGrid.setTop(anchor).
Hopeэто помогает. Веселитесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...