NullPointerException при создании 2-мерного ArrayList в Java и JavaFX - PullRequest
0 голосов
/ 08 декабря 2018

Я хочу закодировать игру «Четыре победы» с JavaFX, но при объявлении двумерных «полей» TextField-Array и распечатке элементов списка я получаю исключение NullPointerException, потому что нетTextField-Objects, но только null-Objects.Может ли кто-нибудь помочь мне с этим?

@FXML Button button1, button2, button3, button4, button5, button6, button7;
    @FXML TextField field00, field01, field02, field03, field04, field05,
              field10, field11, field12, field13, field14, field15,
              field20, field21, field22, field23, field24, field25,
              field30, field31, field32, field33, field34, field35,
              field40, field41, field42, field43, field44, field45,
              field50, field51, field52, field53, field54, field55,
              field60, field61, field62, field63, field64, field65;

    @FXML TextField[][] fields = {
            {field00, field01, field02, field03, field04, field05},
            {field10, field11, field12, field13, field14, field15},
            {field20, field21, field22, field23, field24, field25},
            {field30, field31, field32, field33, field34, field35},
            {field40, field41, field42, field43, field44, field45},
            {field50, field51, field52, field53, field54, field55},
            {field60, field61, field62, field63, field64, field65}
    };

    ArrayList<ArrayList<TextField>> freeFields = new ArrayList<>();

    private String player;
    private int turn = 1;

    public void initialize(){
        player();

        System.out.println(field00.getClass());
        for(int i = 0; i < fields.length; i++){
            ArrayList<TextField> arrayList = new ArrayList<>();
            for(int j = 0; j < fields[0].length; j++){
                arrayList.add(fields[i][j]);
            }
            freeFields.add(arrayList);
        }

    }

1 Ответ

0 голосов
/ 08 декабря 2018

Правая часть

TextField[][] fields = {
        {field00, field01, field02, field03, field04, field05},
        {field10, field11, field12, field13, field14, field15},
        {field20, field21, field22, field23, field24, field25},
        {field30, field31, field32, field33, field34, field35},
        {field40, field41, field42, field43, field44, field45},
        {field50, field51, field52, field53, field54, field55},
        {field60, field61, field62, field63, field64, field65}
};

оценивается во время создания объекта (в инициализаторе).

В настоящее время ни одно из полей не было введено FXMLLoader.,Если вы хотите это исправить, переместите инициализацию поля в метод initialize.Этот метод запускается FXMLLoader после внедрения всех полей:

private TextField[][] fields;

@FXML
private void initialize() {
    fields = ...;
}

Я не думаю, что это хорошая идея для разработки такого графического интерфейса с использованием SceneBuilder / fxml.У вас есть 42 = 7 * 6 TextField объектов в fxml, и если у вас есть опечатка всего за один fx:id, это нарушает код.Было бы лучше / проще поддерживать, если вы используете циклы для создания этих TextField s и вместо этого добавляете их в сцену и структуру данных:

@FXML
private GridPane container; // inject a parent for TextFields here

private TextField[][] fields;

@FXML
private void initialize() {
    fields = new TextField[7][6];
    for (int row = 0; row < fields.length; row++) {
        TextField[] fs = fields[row];
        for (int col = 0; col < fs.length; col++) {
            TextField f = new TextField();
            fs[col] = f;
            container.add(f, col, row);
        }
    }
}
...