我在JavaFX中为列表视图创建自定义单元格时遇到了问题。简而言之,我有一个可观察的对象列表(类型为BillItem)来创建自定义fxml视图并将其添加到列表视图中。
在列表视图中,我只有一个ListView作为根。
<ListView fx:id="bill" prefWidth="200.0" style="-fx-background-color: yellow;" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="restroid.controllers.left.BillViewController"/>
在单元格视图中,我在根目录中有BorderPane和其他3个标签。
<BorderPane fx:id="billItem" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.40"
xmlns:fx="http://javafx.com/fxml/1" fx:controller="restroid.controllers.left.BillItemViewController">
<left>
<Label fx:id="numberOfItems" text="2" BorderPane.alignment="CENTER">
<BorderPane.margin>
<Insets right="10.0"/>
</BorderPane.margin>
</Label>
</left>
<center>
<Label fx:id="itemName" text="Item name" BorderPane.alignment="TOP_LEFT"/>
</center>
<right>
<Label fx:id="price" text="56.00 TL" BorderPane.alignment="CENTER"/>
</right>
</BorderPane>
当我为列表视图加载fxml文件时,我在负责控制器的initialize()方法中设置了一些虚拟数据,并使用setItems()在bill(ListView)上设置它。最后,使用单元工厂,我返回一个类型为BillItem的自定义ListCell。
@Override
public void initialize(URL location, ResourceBundle resources) {
for (int i = 0; i < 10; i++)
billItems.add(new BillItem(2, "Item name", 56.00));
observableList = FXCollections.observableList(billItems);
bill.setItems(observableList);
bill.setCellFactory(param -> new BillItemCell());
}
在BillItemCell类的updateItem()中,我发现“item”为null,我立即得到以下异常。关于如何初始化可观察列表一定存在问题,尽管我遵循的代码示例与我在此处的内容类似。
@Override
protected void updateItem(BillItem item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
BillItemViewController cell = new BillItemViewController();
cell.setNumberOfItems(item.getNumberOfItems());
cell.setItemName(item.getItemName());
cell.setPrice(item.getPrice());
setGraphic(cell.getBillItem());
} else {
System.out.println("item is null");
}
}
Exception in Application start method
Exception in thread "main" java.lang.NoSuchMethodException: restroid.MainApp.main([Ljava.lang.String;)
at java.lang.Class.getMethod(Class.java:1786)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:125)
我的第一个问题是,为什么程序无法将我的可观察列表传递给工厂?
我的另一个问题是我将如何将自定义视图加载到列表视图,因为我没有机会因为这个问题而测试此代码。我做了一些挖掘,并提出了上面的实现。在BillItemViewController中,我只是加载自定义视图并提供必要的setter。
public BillItemViewController() {
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("../../views/left/BillItemView.fxml"));
try {
fxmlLoader.setController(this);
fxmlLoader.load();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
这是正确的做法还是我错过了什么?