Похоже на редко задаваемый вопрос, поэтому, возможно, расширение GridPane - это совсем не тот подход. Я посмотрел на Как расширить пользовательские компоненты JavaFX, использующие FXML и другие.
Я пытаюсь создать класс LawnGrid, который расширяет GridPane, причина в том, чтобы переопределить метод add () для изменения размера узлов ImageView по мере их добавления. Мне также нужно изменить размер на основе расчета размера LawnGrid и выяснения того, шире ли газон, чем он высокий, чтобы сохранить соотношение сторон. Я опускаю детали реализации, которые кажутся несущественными.
Проблема в том, что когда я помещаю LawnGrid в файл .fxml, он не будет отображаться в SceneBuilder (в IntelliJ), что, по моему мнению, является признаком того, что я делаю неправильно. Я получаю эту ошибку:
java.lang.NullPointerException / javafx.fxml.LoadException:
, который указывает на мой view.fxml:
...
(внутри BorderPane)
<center>
<LawnGrid fx:id="lawnGridPane" style=" -fx-border-color:green; -fx-border-width: 10; -fx-border-style: solid;" BorderPane.alignment="CENTER">
</LawnGrid>
</center>
Я хочу добавить ограничения программно, возможно, они мне нужны заранее, но, похоже, я получу другую ошибку. Исходя из приведенного выше связанного ответа, мой LawnGrid.java начинается с:
@DefaultProperty(value = "lawnGrid")
public class LawnGrid extends GridPane {
ОБНОВЛЕНИЕ: Основываясь на отзывах Слоу, я вижу ошибку в том, что аннотация FXML находится не в том месте, перенесла ее в свой FXController.java:
.
// lawn representation for lawn display in GUI
@FXML
private LawnGrid lawnGridPane = new LawnGrid();
FWIW Я также получаю NPE, когда пытаюсь его запустить, приложение появляется, но выдает NPE в строке, где я ссылаюсь на «это» внутри LawnGrid. Я предполагаю, что упускаю что-то фундаментальное в том, как JavaFX создает объекты, и мне нужно где-то создать LawnGrid, но я думал, что файл .fxml настроил это.
РЕДАКТИРОВАТЬ: я добавил super () в мои конструкторы, думая, что это может иметь какое-то значение, но это не так, я думаю, просто с помощью extends
он вызывает super ()? Вот конструкторы в LawnGrid.java:
public LawnGrid(){
super();
// uses default max 10 rows 15 columns
setupLawnConstraints();
}
public LawnGrid(double rows, double columns){
super();
this.numRows = rows;
this.numCols = columns;
setupLawnConstraints();
}
public LawnGrid(double rows, double columns, DoubleProperty preferredSquareSizeProperty) {
super();
this.numRows = rows;
this.numCols = columns;
this.preferredSquareSizeProperty = preferredSquareSizeProperty;
}