在JavaFX中创建自定义单元格

时间:2016-01-17 22:27:00

标签: java listview javafx fxml

我在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);
    }
}

这是正确的做法还是我错过了什么?

0 个答案:

没有答案