Я пытаюсь создать свое первое «настоящее» приложение с java с использованием JavaFX. Я использую F XML для разработки всего этого, поэтому я решил разделить некоторые части на разные файлы .fxml
и связать их с разными контроллерами. Я использую один MainController
, связанный с main.fxml
, а внутри main.fxml
я вызываю некоторые другие файлы f xml, используя fx:include
. Все включает свой собственный контроллер.
Проблема в том, что контроллеры не работают на 100% независимо, иногда вы хотите нажать кнопку, связанную с одним контроллером, и передать это что-то другому контроллеру. У меня есть решение, которое работает, но я не уверен, что это лучший способ сделать это.
Мое решение таково: иметь один абстрактный класс SubController
, который имеет защищенные поля stati c для каждого из субконтроллеров. После инициализации MainController
заполняет все эти поля классами контроллеров, которые он получает из main.fxml
, а также одно поле для самого MainController
. Каждый из субконтроллеров наследуется от SubController
, чтобы иметь доступ к полям stati c и вызывать методы publi c других контроллеров.
public abstract class SubController implements Initializable {
protected static MainController mainController;
protected static MenuBarController menuBarController;
protected static VideoPanelController videoPanelController;
public static void setMainController(MainController mainController) {
SubController.mainController = mainController;
}
public static void setMenuBarController(MenuBarController menuBarController) {
SubController.menuBarController = menuBarController;
}
public static void setVideoPanelController(VideoPanelController videoPanelController) {
SubController.videoPanelController = videoPanelController;
}
}
public class MainController implements Initializable {
@FXML private MenuBarController menuBarController;
@FXML private VideoPanelController videoPanelController;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
SubController.setMainController(this);
SubController.setMenuBarController(menuBarController);
SubController.setVideoPanelController(videoPanelController);
}
Таким образом, когда в строке меню нажимается кнопка, он может использовать метод publi c контроллера видеопанели:
public class MenuBarController extends SubController {
public void openVideo() {
File selectedFile = chooseFiles(VIDEO_EXTENSIONS);
if (selectedFile == null) return;
videoPanelController.loadVideo(selectedFile);
}
}
Это работает довольно хорошо, но я все еще чувствую, что, вероятно, есть более простой способ сделать Это. Это хороший способ go об этом, а если нет, то как еще мне это сделать?