Java 动态更改GWT CellTable的样式,以直观地将其标记为已禁用

Java 动态更改GWT CellTable的样式,以直观地将其标记为已禁用,java,css,gwt,Java,Css,Gwt,我正在寻找一种在运行时动态更改GWT CellTable样式的方法。我想通过使颜色方案变灰使表格看起来“禁用”,以便与其他禁用的输入字段匹配。现在,我可以阻止人们使用该表,但他们没有得到任何视觉提示 我有一个资源包来设置表的样式,如下所述: 这已经传递到构造函数中,并且已经正常工作了一段时间: public DataTable(int pageSize) { super(pageSize, getStyle()); } protected static DataTableStyle g

我正在寻找一种在运行时动态更改GWT CellTable样式的方法。我想通过使颜色方案变灰使表格看起来“禁用”,以便与其他禁用的输入字段匹配。现在,我可以阻止人们使用该表,但他们没有得到任何视觉提示

我有一个资源包来设置表的样式,如下所述:

这已经传递到构造函数中,并且已经正常工作了一段时间:

public DataTable(int pageSize) {
    super(pageSize, getStyle());
}

protected static DataTableStyle getStyle() {
    return GWT.create(DataTableStyle.class);
}
我不知道的是如何在运行时动态调整表的样式。我不确定这是不可能的,还是我错过了什么

我很确定,一旦设置了样式资源,就无法更改附加到单元格表的样式资源。由于我不能这样做,似乎我应该能够将
addStyleDependentName()
addStyleName()
与其他CSS样式结合使用,但我无法找出正确的更改组合

为了进行测试,我尝试覆盖现有的
.cellTableHeader
定义。我知道我的目标是正确的样式,因为如果我将原始样式的
background:#000000
更改为
background:magenta
,它会起作用

.cellTableHeader {
    background: #000000;
    color: #ffffff;
    text-shadow: none;
}
我研究过的一个例子是。该页面建议使用如下CSS:

.cellTableHeader.cellTable-disabled {
    background: magenta; /* just to make it obvious */
}
然后,在我的代码中:

userTable.addStyleDependentName("disabled")
.cellTableHeader.cellTable disabled
样式本身会导致运行时错误:

The following unobfuscated classes were present in a strict CssResource:
cellTable-disabled
Fix by adding String accessor method(s) to the CssResource interface for obfuscated classes, or using an @external declaration for unobfuscated classes. 
解决方法是在样式上使用
@external
,或在资源束上注释
@NotStrict
。这两种方法都可以让我通过运行时错误,但样式不会生效。我还尝试了其他各种方法:

.cellTableHeader.disabled {
    background: magenta; /* just to make it obvious */
}


但在这一点上,我真的只是在抓救命稻草

无法在运行时直接更改样式资源

我看到两种解决办法:

定制CellTableBuilder

使用此解决方案,CellTableBuilder使用的样式将在运行时被替换,当重新绘制表格时,将应用新样式。此解决方案存在一个问题,CellTable不使用CellTableBuilder设置选择样式,因此在生成器上替换样式对选择样式没有影响

带有源代码的自定义CellTableBuilder解决方案的演示

样式代理

另一种解决方案是代理CellTable和生成器使用的样式。在运行时,您可以更改代理使用的有效样式。因为DefaultCellTableBuilder在构建时存储样式值,所以您需要创建一个不缓存样式值的自定义样式值。我没有发现任何问题,但我没有对其进行深入测试


带有源代码的样式代理解决方案演示。

无法在运行时直接更改样式资源

我看到两种解决办法:

定制CellTableBuilder

使用此解决方案,CellTableBuilder使用的样式将在运行时被替换,当重新绘制表格时,将应用新样式。此解决方案存在一个问题,CellTable不使用CellTableBuilder设置选择样式,因此在生成器上替换样式对选择样式没有影响

带有源代码的自定义CellTableBuilder解决方案的演示

样式代理

另一种解决方案是代理CellTable和生成器使用的样式。在运行时,您可以更改代理使用的有效样式。因为DefaultCellTableBuilder在构建时存储样式值,所以您需要创建一个不缓存样式值的自定义样式值。我没有发现任何问题,但我没有对其进行深入测试


带有源代码的style proxy解决方案演示。

谢谢您的建议。我不确定我是否理解这是如何比我所拥有的进步的。我已经能够在创建表格时设置自己的样式。这对我有什么好处?也许我误解了,但是在查看DefaultCellTable Builder的代码之后,这个解决方案似乎具有相同的限制,即在创建表格时只能设置一次样式。表格生成器还用于重新绘制表格,因此您可以设置禁用的样式并要求重新绘制表格。啊哈!这更有道理。一旦有机会,我将使用您的解决方案之一重新编写现有代码。谢谢您的建议。我不确定我是否理解这是如何比我所拥有的进步的。我已经能够在创建表格时设置自己的样式。这对我有什么好处?也许我误解了,但是在查看DefaultCellTable Builder的代码之后,这个解决方案似乎具有相同的限制,即在创建表格时只能设置一次样式。表格生成器还用于重新绘制表格,因此您可以设置禁用的样式并要求重新绘制表格。啊哈!这更有道理。一旦有机会,我将使用您的解决方案之一重新编写现有代码。目前,我解决这一问题的方法是在UI活页夹中的不同HTMLPanel中创建两个具有相同数据源的表/寻呼机对。然后,当我需要禁用状态时,我隐藏一个HTML面板并显示另一个。这有点笨重,但它至少给了我必要的视觉提示。目前,我解决这一问题的方法是在UI活页夹的不同HTMLPanel中创建两个具有相同数据源的表/寻呼机对。然后,当我需要禁用状态时,我隐藏一个HTML面板并显示另一个。它有点笨重,但至少给了我必要的视觉暗示。
.cellTableHeader.disabled {
    background: magenta; /* just to make it obvious */
}
.cellTableHeader .disabled {
    background: magenta; /* just to make it obvious */
}
.cellTableHeader disabled {
    background: magenta; /* just to make it obvious */
}