我有以下代码用于编辑ListView中的单元格:

listView.setCellFactory(new Callback<ListView<TextModule>, ListCell<TextModule>>() {
  @Override public ListCell<TextModule> call(ListView<TextModule> param) {
    TextFieldListCell<TextModule> textCell = new TextFieldListCell<TextModule>() {
      @Override public void updateItem(TextModule item, boolean empty) {
        super.updateItem(item, empty);
        if (item != null) {
          setText( item.getSummary());
        }
        else {
          setText(null);
        }
      }
    };
    return textCell;
  }
});


现在的问题是,如果我双击输入ListView中的任何单元格,就可以编辑该单元格,但是属性(显示的文本)将更改为类定义,如com.test.tools.tbm.model.TextModule@179326d。通常,它会显示诸如“ Hello World”之类的文本。

最佳答案

如果没有为TextFieldListCell提供适当的字符串转换器,它将使用默认实现(来自CellUtils):

private static <T> String getItemText(Cell<T> cell, StringConverter<T> converter) {
    return cell.getItem().toString();
}


在您的情况下显示为com.test.tools.tbm.model.TextModule@179326d,因为cell.getItem()返回TextModule的实例。

因此,您需要在toString()类中覆盖TextModule

class TextModule {
    private final String summary;

    public TextModule(String summary){
        this.summary=summary;
    }

    public String getSummary(){ return summary; }

    @Override
    public String toString(){
        return summary;
    }
}


或者,您也可以提供自己的StringConverter

    listView.setCellFactory(TextFieldListCell.forListView(new StringConverter<TextModule>(){

        @Override
        public String toString(TextModule item) {
            return item.getSummary();
        }

        @Override
        public TextModule fromString(String string) {
            return new TextModule(string);
        }

    }));

07-28 03:39