【问题标题】:Eclipse scout Tree table fieldEclipse Scout Tree 表字段
【发布时间】:2017-07-30 06:00:18
【问题描述】:

我正在寻找表格字段的树状表示组件。

我正在寻找的是带有列的表格,但可以选择像树一样折叠单元格。

【问题讨论】:

  • Scout 模型中没有开箱即用的树表。一些项目已经设法滥用表格小部件(展开和折叠行,就像在树表中一样)。我会花时间分享解决方案(因为问题一次又一次)

标签: tree eclipse-scout


【解决方案1】:

Scout 中没有内置的树表,但可以滥用表使其看起来像树表。我刚刚在this Gist 中提出了一个实现。

AbstractTreeTable是表格模板,在表格中增加了2列:

  • KeyColumn:表的主键
  • ParentKeyColumn:父行的键,如果行在树根,则为 null。

AbstractTreeTable 处理每个节点行的折叠状态。它还装饰了第一列(节点上的缩进和[+] &[-] 标记)。它处理行操作 (execRowAction(..))。

如果您在表格页面中使用它,建议使用TablePageData 而不是Object[][]。如果您在表字段中使用它,它仅在表字段使用bean based table data 时才有效。

我的原型可以改进:

  • 不支持排序(对于一列,可以定义行需要如何排序:如果它们具有不同的父级 -> 比较两个父级值;如果它们具有相同的父级 -> 单元格值)。
  • 如果您尝试对其应用过滤器,我没有测试内容的行为方式(也可以改进)。
  • 需要检查大量行的性能。
  • execMethods 不应在模板级别使用

示例:

@Order(10.0)
@FormData(value = AbstractTableFieldBeanData.class, sdkCommand = SdkCommand.USE, defaultSubtypeSdkCommand = DefaultSubtypeSdkCommand.CREATE)
public class CarsTableField extends AbstractTableField<CarsTableField.Table> {

  @Override
  protected int getConfiguredGridH() {
    return 8;
  }

  @Override
  protected int getConfiguredGridW() {
    return 2;
  }

  @Override
  protected String getConfiguredLabel() {
    return TEXTS.get("Cars");
  }

  @Order(10.0)
  public class Table extends AbstractTreeTable {

    /**
     * @return the PriceFromColumn
     */
    public PriceFromColumn getPriceFromColumn() {
      return getColumnSet().getColumnByClass(PriceFromColumn.class);
    }

    /**
     * @return the NameColumn
     */
    public NameColumn getNameColumn() {
      return getColumnSet().getColumnByClass(NameColumn.class);
    }

    @Override
    protected boolean execIsNode(ITableRow row) {
      return getParentKeyColumn().getValue(row) == null;
    }

    @Override
    protected void execDecorateRow(ITableRow row) throws ProcessingException {
      if (execIsNode(row)) {
        row.setFont(FontSpec.parse("BOLD"));
      }
    }

    @Override
    public void importFromTableBeanData(AbstractTableFieldBeanData source) throws ProcessingException {
      super.importFromTableBeanData(source);

      toggleExpandedState(getRows());
    }

    @Order(10.0)
    public class NameColumn extends AbstractStringColumn {

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("CarModel");
      }
    }

    @Order(20.0)
    public class PriceFromColumn extends AbstractIntegerColumn {

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("PriceFrom");
      }
    }
  }
}

@Order(10.0)
@FormData(value = AbstractTableFieldBeanData.class, sdkCommand = SdkCommand.USE, defaultSubtypeSdkCommand = DefaultSubtypeSdkCommand.CREATE)
public class FilesTableField extends AbstractTableField<FilesTableField.Table> {

  @Override
  protected int getConfiguredGridH() {
    return 8;
  }

  @Override
  protected int getConfiguredGridW() {
    return 2;
  }

  @Override
  protected String getConfiguredLabel() {
    return TEXTS.get("Files");
  }

  @Order(10.0)
  public class Table extends AbstractTreeTable {

    @Override
    protected boolean execIsNode(ITableRow row) {
      Long type = getTypeColumn().getValue(row);
      return FileTypeCodeType.FolderCode.ID.equals(type);
    }

    @Override
    public void importFromTableBeanData(AbstractTableFieldBeanData source) throws ProcessingException {
      super.importFromTableBeanData(source);

      toggleExpandedState(getRows());
    }

    @Override
    protected void execDecorateRow(ITableRow row) throws ProcessingException {
      Long type = getTypeColumn().getValue(row);
      if (FileTypeCodeType.FolderCode.ID.equals(type)) {
        row.setIconId(Icons.FOLDER);
      }
      else if (FileTypeCodeType.FileCode.ID.equals(type)) {
        row.setIconId(Icons.DOCUMENT);
      }
      else if (FileTypeCodeType.EmailCode.ID.equals(type)) {
        row.setIconId(Icons.EMAIL);
      }
      else if (FileTypeCodeType.VCardCode.ID.equals(type)) {
        row.setIconId(Icons.VCARD);
      }
    }

    /**
     * @return the TypeColumn
     */
    public TypeColumn getTypeColumn() {
      return getColumnSet().getColumnByClass(TypeColumn.class);
    }

    /**
     * @return the ModifiedDateColumn
     */
    public ModifiedDateColumn getModifiedDateColumn() {
      return getColumnSet().getColumnByClass(ModifiedDateColumn.class);
    }

    /**
     * @return the NameColumn
     */
    public NameColumn getNameColumn() {
      return getColumnSet().getColumnByClass(NameColumn.class);
    }

    @Order(20.0)
    public class NameColumn extends AbstractStringColumn {

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("Name");
      }

      @Override
      protected int getConfiguredWidth() {
        return 400;
      }
    }

    @Order(30.0)
    public class ModifiedDateColumn extends AbstractDateColumn {

      @Override
      protected String getConfiguredFormat() {
        return "dd.MM.yyyy hh:mm";
      }

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("DateModified");
      }

      @Override
      protected int getConfiguredWidth() {
        return 200;
      }
    }

    @Order(40.0)
    public class TypeColumn extends AbstractSmartColumn<Long> {

      @Override
      protected Class<? extends ICodeType<?, Long>> getConfiguredCodeType() {
        return FileTypeCodeType.class;
      }

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("Type");
      }

      @Override
      protected int getConfiguredWidth() {
        return 200;
      }
    }
  }
}

当然,这只是解决实际问题的一种解决方法:scout 缺少模型级别的树表表示。如果有类似的东西,就可以在不同的 UI 中使用真正的树表小部件。

【讨论】:

  • 非常重要的问题。我按照您的示例下载模板,但现在我遇到了一个问题。 AbstractTreeTable 的表单数据不会生成,并且在表字段中,所有其他列都在里面,除了树表中的那些列。如何解决这个问题?
  • 它仅在表字段使用bean based table data 时才有效,因为基于数组的表数据不支持表继承。
  • 我不太明白这个。我认为如果我使用表单数据,这是基于 bean 的表数据。在我的表字段中,我有这样的:@FormData(value = AbstractPurchasePriceHistoryTableData.class, sdkCommand = FormData.SdkCommand.USE, defaultSubtypeSdkCommand = FormData.DefaultSubtypeSdkCommand.CREATE) 在树表中我有 @FormData(value = AbstractTreeTableData.class, sdkCommand = FormData.SdkCommand.USE, defaultSubtypeSdkCommand = FormData.DefaultSubtypeSdkCommand.CREATE) 但 AbstractTreeTableData.class 始终为空。
  • @FormData 注释始终用于TableField 类(可以在每个层次结构级别定义某些内容)。第一级是AbstractTableField(在侦察罐中)。您表单中的 TableField 直接扩展了此类,或者您在类继承图中有另一个抽象类(也称为模板)。 Table 类上不需要有 @FormData; SDK不要读它。根据您的情况,注释的参数不一样。 wiki 页面上提供了几个示例。随意提出其他问题来详细讨论。
猜你喜欢
  • 2021-03-13
  • 2016-07-29
  • 2016-06-13
  • 2016-06-04
  • 1970-01-01
  • 2016-09-13
  • 2015-04-28
  • 1970-01-01
  • 2016-07-09
相关资源
最近更新 更多