我的应用程序具有以下控制器:
this.countryMap[state.country_id].name
customerPane是扩展的GridPane:
public class Controller {
@FXML
private CustomerPane customerPane;
}
我的* .fmxl看起来像(我省略了一些细节):
public class CustomerPane extends GridPane {
@FXML
private TableView<Customer> customerTable;
public CustomerPane() {
System.out.println(this.customerTable);
}
}
我在这里遇到两个问题:
如果使用场景构建器保存fmxl文件,它将覆盖我的CustomerPane的导入。为什么会这样,我该如何解决?
<?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>
导致为空。为什么以及如何解决?
答案 0 :(得分:0)
使用类作为控制器并使用与该类同名的元素进行创建是不同的。
在您的情况下,您假设Controller
的实例用作控制器实例:
创建了一个CustomerPane
实例,但是由于它不是控制器,因此该对象的customerTable
字段不是目标对象,可以将该对象注入。
您应该尝试使用Custom Component方法:
<?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/>