У меня есть проект Java, над которым я работаю, который использует JavaFX для создания пользовательского интерфейса. Я не очень программист на Java (не большая часть программиста в целом - я студент CS), так что это немного учебный опыт, но, как правило, я отвечаю на свои вопросы, когда я иду. Тем не менее, я теперь сталкиваюсь с липким пятном с TableView, и немного теряюсь - в частности, я не могу представить никаких действий в ответ на взаимодействие с TableView.Определение TableView onMouseПредусмотренные действия в FXML
Текущий макет моего проекта - Main.java, Controller.java и UI.fxml. В главном окне панель/сцена загружается из UI.fxml при запуске программы. (Технически проект содержит несколько других битов кода, но я пытаюсь только после того, что релевантно.) У меня есть TableView определено в UI.fxml, как так:
<TableView fx:id="queueTable">
<columns>
<TableColumn text="Title">
<cellValueFactory>
<PropertyValueFactory property="tableTitle"/>
</cellValueFactory>
</TableColumn>
<TableColumn text="Artist">
<cellValueFactory>
<PropertyValueFactory property="tableArtist"/>
</cellValueFactory>
</TableColumn>
<TableColumn text="Album">
<cellValueFactory>
<PropertyValueFactory property="tableAlbum"/>
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
Аналогично у меня есть несколько кнопок, определенных в интерфейсе .fxml с OnAction, как так:
<Button fx:id="buttonQueueAdd" text="Add" onAction="#addMediaToQueue"/>
в моем предыдущем коде я был в состоянии определить событие для того, когда был выбран элемент в TableView, в способе, где мой TableView был быть сгенерирован. Теперь, однако, все создание пользовательского интерфейса выполняется через файл FXML. Файл FXML имеет класс контроллера, к которому он относится (Controller.java), где все действия определены для разных кнопок, но я не могу заставить его принимать какие-либо атрибуты, такие как onAction
, setOnMousePressed
и т. Д. В FXML файл для TableView, так как он принимает атрибут 'onAction' для Button.
Кажется, что я могу получить обходное решение, определяя действие в моем основном классе (или создавая метод в моем классе Controller, который вызывается в классе Main, когда создается сцена), но это не будет работайте, если я не сделаю queueTable
статичным в моем классе контроллера ..., который затем разбивает все функции, которые обрабатывают элементы в TableView - например, я больше не могу добавлять элементы в TableView/пользовательский интерфейс не обновляется, чтобы показать, что элементы добавлены.
Похоже, лучшее решение - не иметь TableView, созданного в FXML, вместо этого создать TableView и все его события onMousePressed и т. Д., Установленные за пределами файла FXML, и добавить их в сцену в моем Метод основного класса start
. Это было сделано ранее, и тогда это было приемлемо. Однако это кажется беспорядочным и приводит к тому, что мои элементы пользовательского интерфейса усеяны несколькими классами и/или файлом FXML - это проект, над которым я работаю с несколькими другими учениками, и я стараюсь держать все как упорядоченное/организованное насколько это возможно. Должен ли я укусить пулю и сделать это «грязным» способом, или есть лучший вариант?