Реализация FXML: какова цель и практичность? - PullRequest
0 голосов
/ 30 октября 2019

Я создаю сцену для своей игры в JavaFX. Чтобы собрать содержимое этого этапа, я собираюсь собрать серию панелей, которые можно создавать и изменять по мере необходимости, и я создаю класс для каждой панели. Например, у меня есть класс ScoreboardPane для табло и класс BoardPane для игрового поля и каждой игровой фигуры. Если я смогу создать эти классы панелей, чтобы они не зависели друг от друга, их перестановка в рабочей области с помощью AnchorPane должна быть тривиальной.

Моя проблема связана с попыткой реализовать лучшие практики кода. Основываясь на моих исследованиях, я рекомендую создавать эти панели с помощью FXML, создавая классы контроллеров для каждой из них. Поэтому для ScoreboardPane я бы в итоге получил класс ScoreboardPane, в котором есть код, который создает ScoreboardPane, класс ScoreboardPaneController и файл ScoreboardPane.fxml. Поэтому, если я понимаю, ScoreboardPane будет представлением, а файл ScoreboardPaneController и FXML будет контроллером. Тогда у меня был бы другой класс под названием «Табло», который будет служить моделью и содержать бизнес-логику. ScoreboardPaneController будет загружен в класс MainWindowPane, который содержит ScoreboardPane.

Чтобы соответствовать модели MVC, эта настройка имеет смысл, но на практике я вижу, что контроллер просто выступает в качестве буфера. Это потому, что все мои панели зависят от данных игры из класса Model, которые будут созданы правильно. Например, чтобы создать ScoreboardPane, мне нужно установить имена игроков, которые я не могу установить в методе initialize (), так как я должен передать имена в контроллер после вызова load (). Поэтому вместо создания ScoreboardPane путем вызова ScoreboardPane (names) я создаю класс и контроллер FXML и загружаю его, передавая имена в контроллер для достижения той же цели.

Такое ощущение, что я беру все переменные, которые мне нужны для построения ScoreboardPane, и переносу их в назначенную «область построения панели», когда у меня уже есть все, что мне нужно для их построения в самой ScoreboardPane. Какое значение имеет прохождение всего этого дополнительного написания кода, если мои панели не имеют ничего для контроллера, чтобы добавить? Это просто для защиты будущего кода?

Файл FXML

<?import game.gui.pane.*?>

<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<ScoreboardPane fx:id="sPane" 
fx:controller="game.controller.pane.ScoreboardPaneController" 
xmlns:fx="http://javafx.com/fxml">
</ScoreboardPane>

Файл контроллера

package game.controller.pane;

import game.gui.pane.ScoreboardPane;
import javafx.fxml.FXML;

public class ScoreboardPaneController {

@FXML
ScoreboardPane sPane;

@FXML
String[] names;

@FXML
public void initialize()
{

}

@FXML
public void createPane()
{ 
    sPane.setNames(names); //Assigns names in ScoreboardPane class
}

public void setNames(String[] n)
{
    names = n;
}

}

Файл MainWindowPane

package game.gui.pane;

public class MainWindowPane
{
private String[] playerNames;

public MainWindowPane(GameData data)
{
     String[] names = data.getNames(); //Retrieved from model class
     ScoreboardPane scoreboard = createScoreboardPane(names);
}

private void createScoreboardPane(String[] names)
{
try
{
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/game/fxml/pane/ScoreboardPane.fxml")); 
    ScoreboardPane root = fxmlLoader.load();
        ScoreboardPaneController controller = fxmlLoader.<ScoreboardPaneController>getController();
    controller.setNames(names);
    controller.createPane();
    return root;
}
catch(Exception e)
{
    e.printStackTrace();
    return null;
}
}

}
...