Я реализую пользовательские TableView
элементы, такие как custom ContextMenu
, как tableMenu. Для этого мне нужно получить экземпляр TableHeaderRow
, но у меня возникли проблемы. В методе initialize()
TableView#getSkin()
равен нулю. Но мне интересно, почему? Когда инициализируется Skin
? Чтобы получить временное решение, я использую Platform.runLater()
, но оно работает не каждый раз, как ожидалось. Как я помню @kleopatra, упомянутый в комментарии, вы не можете быть уверены, что runLater()
будет выполнено в ожидаемое время.
Это иногда приводит к тому, что пользовательское ContextMenu отображается неправильно.
Вот так выглядит мой Controller
класс:
public class Controller implements Initializable {
@FXML
private TableView<?> tableView;
@Override
public void initialize(URL location, ResourceBundle resources) {
// null
System.out.println(tableView.getSkin());
// most of the time not null. but it happens to be null
Platform.runLater(() -> System.out.println(tableView.getSkin()));
// here getTableHeader returns null
applyCustomTableMenu(getTableHeader(tableView));
// here getTableHeader sometimes returns the nonnull reference
Platform.runLater(() -> applyCustomTableMenu(getTableHeader(tableView)));
}
private TableHeaderRow getTableHeader(TableView<?> tableView) {
return (TableHeaderRow) tableView.queryAccessibleAttribute(AccessibleAttribute.HEADER);
}
private void applyCustomTableMenu(TableHeaderRow tableHeaderRow) {
// implementation
System.out.println(tableHeaderRow);
}
}
Где находится точка, когда я могу быть уверен, что скин инициализирован, и я могу получить ненулевую ссылку на мой TableHeaderRow
?
Я бы также принял любое предложение, которое предоставляло бы мне каждый раз ненулевую ссылку на мой TableHeaderRow
.