Как расширить GridPane в JavaFX для переопределения add () дает NPE, перерывы в Scene Builder - PullRequest
1 голос
/ 31 марта 2019

Похоже на редко задаваемый вопрос, поэтому, возможно, расширение 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;
    }

1 Ответ

0 голосов
/ 01 апреля 2019

В конце концов, я вызывал getHeight на GridPane (или подклассе из одного). Когда я наконец очистил свою голову и действительно подумал об этом, я осмотрел объект прямо перед тем, как он сломался.

Некоторые свойства объектов JavaFX являются нулевыми, если они не были установлены ранее. Доступ к ним с помощью getHeight () приводит к (правильному) исключению нулевого указателя.

"высота" является одним из них, есть "_height", но я не понял, как получить к нему доступ.

...