【问题标题】:DataGrid / CellTable styling frustration -- overriding row stylesDataGrid / CellTable 样式受挫——覆盖行样式
【发布时间】:2011-09-12 21:15:59
【问题描述】:

我正在努力设计我的 GWT 2.4 DataGrid 的样式,并且每时每刻都遇到障碍。我在 DataGrid 中添加了以下行样式:

dataTable.setRowStyles(new RowStyles<IntegrityItem>() {
  @Override
  public String getStyleNames(IntegrityItem row, int rowIndex) {
      if (row.getSomeValue() >= 100) {
        return MyResources.INSTANCE.mystyles().alertRow();
      } else {
        return "";
      }
  }
});

alertRow 的样式很简单:

.alertEntry {
    font-weight: bold;
    color: #00ff00;
    background-color: #ff0000;
}

更多信息:我制作了 DataGrid.css 的本地副本,并从所有样式中删除了所有“背景”元素,并使用它来构造 ClientBundle:

public interface MyDataGridResources extends DataGrid.Resources {

  public static final FmeaDataGridResources INSTANCE = GWT.create(MyDataGridResources.class);

  @Override
  @Source({"../resources/styling/mydatagridstyles.css"})
  Style dataGridStyle();

}

我在我的 DataGrid 构造函数中使用了这个 (MyDataGridResources.INSTANCE)。

当我试用它时,符合条件的行包含绿色 (#00ff00) 文本,但背景颜色保持为白色或灰色,具体取决于它是偶数行还是奇数行。背景颜色是如何被忽略的?它首先从哪里获得这些颜色?我已经从 css 文件中完全删除了背景颜色信息。

【问题讨论】:

    标签: css gwt datagrid styling


    【解决方案1】:

    您可以创建自定义 CSS 文件并通过定义新样式资源将其提供给 DataGrid。这是通过创建一个扩展 DataGrid.Resources 的类型来完成的,它知道您的 CSS 文件。然后将其传递给数据网格的构造函数。

    为了提供一个相当完整的示例,首先为 DataGrid 样式创建一个新类型。 (像这样定义新类型只是在 GWT 中唯一标识您的样式)。

    public interface MyStyle extends DataGrid.Style {
    }
    

    然后,定义一个覆盖 DataGrid.Resources 中的 dataGridStyle() 方法存根的接口。 dataGridStyle 方法应该返回之前定义的 MyStyle。

    注意 @Source 注释的两个元素 - 您可以在您提供的第二个文件(此处为“DataGridOverride.css”)中覆盖默认 CSS (DataGrid.css) 中的任何类名。

    public interface DataGridResource extends DataGrid.Resources {
    
      @Source({ DataGrid.Style.DEFAULT_CSS, "DataGridOverride.css" })
      MyStyle dataGridStyle();
    };
    

    要构建新样式的数据网格,您需要做的就是:

    DataGridResource resource = GWT.create(DataGridResource.class);
        dataGrid = new DataGrid<T>(pageSize, resource)
    

    一个微妙之处是,当您增加被覆盖样式的优先级时,您可能需要覆盖任何其他需要更高优先级的样式,例如行悬停规则需要位于行样式规则之后。

    【讨论】:

    • 关于声明:“您不需要定义一个单独的接口来覆盖 DataGrid.Style ......它可以工作但没有实现任何东西。”仅当您只有一个 DataGridResource 时才适用。只要您想为不同的 DataGrids(例如,默认视图和紧凑视图)使用不同的 DataGridResources,混淆的类名将相同,并且两个表将开始发生类冲突。请参阅 GWT 错误 6144。如果您更正您的陈述,我会支持您的答案。
    • 谢谢杰,我已经删除了有问题的声明,并建议应该覆盖 DataGrid.Style。
    • 别忘了方法签名应该是 MyStyle dataGridStyle();不是 DataGrid.Style dataGridStyle();我已经投票了,谢谢,这是一个很好的答案。
    • dataGrid = new DataGrid&lt;T&gt;(pageSize, resource) , 如何为 UIBinder 设置 CSS 资源
    【解决方案2】:

    http://code.google.com/p/google-web-toolkit/issues/detail?id=6144#c3(这不是错误!)

    简而言之,扩展DataGrid.Style(目标只是拥有一个新类型,您不必向其中添加任何内容)并让您的dataGridStyle 覆盖方法返回您自己的子类型而不是DataGrid.Style(由于返回类型协方差,它会起作用)

    【讨论】:

    • 返回...类型...协方差...嗯...是时候破解Java参考了。但它奏效了!!谢谢!
    • 自己的子类型是基本的。我忘了它,我对数据网格的随机样式感到疯狂。感谢您的建议和票证参考。
    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 2020-09-21
    • 2020-05-27
    • 2013-10-18
    • 2020-12-20
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多