【问题标题】:How to download fxml with custom cell in a ListView?如何在 ListView 中使用自定义单元格下载 fxml?
【发布时间】:2016-07-26 15:00:33
【问题描述】:

我想在ListView 中创建一个自定义单元格。原谅我的英语不好! 我想在ListView 中显示图片、名称和状态。 为此,我使用了一个不同的 Fxml 包含 Hbox

  public class Controller {    
   CollectionContactForListCollection contactForList = new   CollectionContactForListCollection();
@FXML
private ListView<Contact> listContact ;
@FXML
HBox hbox;
@FXML
ImageView avatar;
@FXML
Label labelName;
@FXML
Label lblStatus;
@FXML
Label lblSense;

@FXML
private void initialize(){ 
    contactForList.fieldData();
    // listContact.setItems((ObservableList)       contactForList.getContactList()); 
    listContact.setCellFactory(new Callback<ListView<Contact>, ListCell<Contact>>() {
        @Override
        public ListCell<Contact> call(ListView<Contact> param) {              
            ListCell<Contact> listCell = new ListCell<Contact>() {                    
                @Override
                protected void updateItem(Contact item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty || item == null) {
                        setText(null);
                        setGraphic(null);
                    } else {
                        //This method does not work download                          
                       FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/boxInContact.fxml"));
                       fxmlLoader.setController(this);                      
                        labelName.setText(item.getName());
                        lblSense.setText(item.getSense());
                        lblStatus.setText(item.getStatus());
                        avatar.setImage(item.getImage());                            
                    }
                }
            };
            return listCell;
        }
    });
    listContact.setItems((ObservableList) contactForList.getContactList());
}

【问题讨论】:

  • 请说明具体问题是什么
  • 您是否已经检查了右侧的相关链接,例如stackoverflow.com/questions/19588029/… ?
  • @NoamHacker 我想知道我是否正确加载了 fxml。也许还有另一种创建自定义单元格的方法。
  • @jns 是的。我看到了这个答案,但我不工作。

标签: java javafx fxml hbox


【解决方案1】:

一般来说,您应该为每个 FXML 文件使用不同的控制器类。使用您拥有的代码,所有单元格都使用相同的控制器实例,因此每个控件只有一个引用,即使有很多 labelNames 等(每个单元格一个)。

所以为列表单元定义的FXML定义一个控制器,并定义更新控件所需的方法:

public class ContactCellController {

    @FXML
    private Label labelName ;
    @FXML
    private Label labelStatus ;
    @FXML
    private Label labelSense ;
    @FXML
    private ImageView avatar ;

    public void setName(String name) {
        labelName.setText(name);
    }

    public void setStatus(String status) {
        labelStatus.setText(status);
    }

    public void setSense(String sense) {
        labelSense.setText(sense);
    }

    public void setAvatarImage(Image image) {
        avatar.setImage(image);
    }
}

更新 FXML 文件以使用带有 fx:controller="my.package.ContactCellController" 的控制器属性,然后您的单元实现可能如下所示

listContact.setCellFactory(lv -> new ListCell<Contact>() {
    private Node graphic ;
    private ContactCellController controller ;

    {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/boxInContact.fxml"));
            graphic = loader.load();
            controller = loader.getController();
        } catch (IOException exc) {
            throw new RuntimeException(exc);
        }
    }

    @Override
    protected void updateItem(Contact contact, boolean empty) {
        super.updateItem(contact, empty);
        if (empty) {
            setGraphic(null);
        } else {
            controller.setName(contact.getName());
            controller.setStatus(contact.getStatus());
            controller.setSense(contact.getSense());
            controller.setAvatarImage(contact.getImage());
            setGraphic(graphic);
        }
    }
});

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 2013-11-04
    • 2019-01-22
    • 2015-04-10
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多