Я создаю сцену для своей игры в 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;
}
}
}