使用CSSResources在CellTable中设置单个单元格的样式

时间:2012-01-13 13:04:12

标签: java gwt gwt-2.2-celltable

基本上我想实现类似于GWT documentation

中定义的单元格着色的东西

但是我不想直接在DIV元素上指定样式,但是想要从我为我的CellTable定义的自定义CSSResource中指定一个模糊的样式名。

以下是一些代码:

我为我的CellTable定义了一个自定义Resources界面:

public interface CellTableResources extends Resources {

    @Source({CellTable.Style.DEFAULT_CSS,CellTableStyle.STYLE})
    CellTableStyle cellTableStyle();

    public interface CellTableStyle extends Style {
        String STYLE = "CellTable.css";

        public Sring coloredCell();
    }
}

我把它传递给我的CellTable的构造函数:

CellTable<XY> table = new CellTable<XY>(15,cellTableResources);

这就是我的自定义单元格的样子。

public class ColorCell extends AbstractCell<String> {

    interface Templates extends SafeHtmlTemplates {

      @SafeHtmlTemplates.Template("<div class=\"{0}\">{1}</div>")
      SafeHtml cell(String classname, SafeHtml value);
    }
    private static Templates templates = GWT.create(Templates.class);

    @Override
    public void render(Context context, String value, SafeHtmlBuilder sb) {
      if (value == null) {
        return;
      }
      // how can I access the CSSResources which I pass to the CellTable
      CellTableResources ressources = ?
      String className = ressources.cellTableStyle().coloredCell();

      SafeHtml safeValue = SafeHtmlUtils.fromString(value);
      SafeHtml rendered = templates.cell(className, safeValue);
      sb.append(rendered);
    }
  }

如何在我的自定义单元格中访问传递给我的CellTable的CellTableRessources? 这是重要的部分:

// how can I access the CSSResources which I pass to the CellTable
CellTableResources ressources = ?
String className = ressources.cellTableStyle().coloredCell();

我提出的唯一解决方案是将CellTableRessources传递给我的AbstractCell的构造函数。 是不是有更优雅的方式(我已经把它传递给了CellTable)。

我认为主要问题是:
“如何从单元格或列中访问CellTable变量?”

1 个答案:

答案 0 :(得分:0)

“更优雅的方式”的问题在于它暗示CellTable自己的风格在其他地方会有用,而他们可能不会。即使他们为样式提供了一个getter,它也会返回一个Style类型的实例,然后你必须按照自己的风格进行投射。

最好将此视为您的风格,它提供了一些选项:

  • 保留一个参考,以便您可以从您的单元格中访问它
  • GWT。在你的单元格中创建一个客户端包的新副本并调用ensureInjected() - 它实际上只会注入一次,所以这确实不是问题,只是一个好的做法,特别是如果有人决定使用它你的单元格没有桌子上的风格。
  • 最后,将单元格所需的样式分解为自己的clientbundle / cssresource,并使它们成为单元格本身的一部分。这使您可以完全分解单元格的依赖性,甚至可以放在单元格中(与celllist或cellbrowser等相对)。

唯一棘手的部分是如果单元格上的样式依赖于表格中的样式,在这种情况下,你正在处理这种令人烦恼的依赖是一件好事 - 它要求你要注意样式本身的依赖性。如果你选择第三个(我认为这是最干净的)选项但仍然具有这种依赖性,你可以更进一步 - 在你的单元格中声明一个样式/ clientbundle,但是像你对CellTable的ClientBundle那样扩展它 - 和由于这些是接口,您可以创建一个扩展这两个接口的捆绑包,并提供给每个表和单元。