JavaFX - доступ к вложенному свойству через конструктор сцены - PullRequest
0 голосов
/ 04 сентября 2018

Я получил следующий контроллер для моего приложения:

public class Controller {

    @FXML
    private CustomerPane customerPane;

}

CustomerPane - это расширенная GridPane:

public class CustomerPane extends GridPane {

    @FXML
    private TableView<Customer> customerTable;

    public CustomerPane() {
        System.out.println(this.customerTable);
    }

}

Мой * .fmxl выглядит (я пропустил некоторые детали):

<?import vm.CustomerPane?>
<CustomerPane fx:id="customerPane" layoutX="316.0" prefHeight="654.0" prefWidth="536.0" style="-fx-background-color: #7C8184;">
    <children>
        <TableView fx:id="customerTable" editable="true" prefHeight="200.0" prefWidth="461.0" GridPane.columnSpan="2" GridPane.rowIndex="1">
        </TableView>
    </children>
</CustomerPane>

У меня здесь две проблемы:

  1. Если я сохраню fmxl-файл в компоновщике сцен, он переопределит импорт моей CustomerPane. Почему это так и как я могу это исправить?

  2. customerTable ведет к нулю. Почему и как я могу это исправить?

1 Ответ

0 голосов
/ 05 сентября 2018

Использование класса в качестве контроллера и создание - это использование элемента с тем же именем, что и у класса. Это разные вещи.

В вашем случае вы предполагаете, что экземпляр Controller используется в качестве экземпляра контроллера:

Экземпляр CustomerPane создан, но, поскольку он не является контроллером, поле customerTable этого объекта не является целевым объектом, в который можно внедрить.

Вы должны попытаться использовать Пользовательский компонент подход:

<?import vm.CustomerPane?>
<fx:root type="vm.CustomerPane" layoutX="316.0" prefHeight="654.0" prefWidth="536.0" style="-fx-background-color: #7C8184;" xmlns:fx="http://javafx.com/fxml/1">
    <children>
        <TableView fx:id="customerTable" editable="true" prefHeight="200.0" prefWidth="461.0" GridPane.columnSpan="2" GridPane.rowIndex="1">
        </TableView>
    </children>
</fx:root>
public class CustomerPane extends GridPane {

    @FXML
    private TableView<Customer> customerTable;

    public CustomerPane() {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxmlpackage/fxmlName.fxml"));
        loader.setRoot(this);
        loader.setController(this);
        try {
            loader.load();
        } catch (IOException ex) {
            throw new IllegalStateException(ex);
        }
        System.out.println(this.customerTable);
    }

}

Это позволяет вам использовать new CustomerPane() для создания экземпляра или, альтернативно, использовать элемент <CustomerPane> для создания его внутри fxml

<CustomerPane/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...