我有一个包含TextArea的简单UiBinder小部件:
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:TextArea visibleLines="3" />
</ui:UiBinder>
我想控制此textarea的背景颜色,以便进行可写和只读状态。 GWT使用“-readonly”样式名称装饰器来实现此目的。所以我试试这个:
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:style>
.textBoxStyle {
background-color:yellow;
}
.textBoxStyle-readonly {
background-color:lightgray;
}
</ui:style>
<g:TextArea styleName="{style.textBoxStyle}" visibleLines="3" />
</ui:UiBinder>
显然这不起作用,因为样式名称对CssResources进行了模糊处理,导致类似这样的内容:
.G1x26wpeN {
background-color:yellow
}
.G1x26wpeO {
background-color: lightgray;
}
可写textarea的结果HTML如下所示:
<textarea tabindex="0" class="G1x26wpeN" rows="3"/>
只读textarea看起来像这样:
<textarea tabindex="0" class="G1x26wpeN G1x26wpeN-readonly" readonly="" rows="3"/>
如何声明样式,以便GWT会混淆主要部分,而不是“-readonly”decdorator?
我知道我可以禁用整个样式名称的混淆。但是我想在使用装饰器的同时保持混淆。
答案 0 :(得分:20)
此时(GWT 2.4),它不受支持,并且不清楚是否/何时支持它,请参阅GWT问题跟踪器中的issue 4746。
解决方法是添加@external
,这会禁用这些样式的模糊处理。在这种情况下,将是:
@external textBoxStyle, textBoxStyle-readonly;
答案 1 :(得分:5)
如果您想对所有只读TextArea
使用此样式,那么我建议您只修改GWT主题CSS文件中的.gwt-TextArea-readonly
样式。
否则,我只能考虑在设置TextArea
只读时以编程方式添加自定义样式。
PS:来自docs:
<set-configuration-property name="CssResource.obfuscationPrefix" value="empty" />` can be used for minimal-length selector names, but this is only recommended when the GWT module has total control over the page.
我建议使用这个(带有“空”或“X”或其他未使用的前缀)用于更短的类名 - 因为在默认设置下,你不会通过混淆获得那么多(textBoxStyle - 12chars,G1x26wpeN - 9chars,X0 - 2个字符;))。
答案 2 :(得分:5)
你为什么不试试这样的
public class MyFoo extends Widget {
interface MyStyle extends CssResource {
String normal();
String readonly();
}
@UiField MyStyle style;
/* ... */
void setEnabled(boolean enabled) {
getElement().addStyle(enabled ? style.normal() : style.readonly());
getElement().removeStyle(enabled ? style.readonly() : style.normal());
}
}
这将允许您在文本框“正常”或只读时更改样式...
当然,在UiBinder中你应该有......
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'>
<ui:style type='com.my.app.MyFoo.MyStyle'>
.redBox { background-color:pink; border: 1px solid red; }
.normal { color:black; }
.readonly { color:gray; }
</ui:style>
<div class='{style.redBox} {style.normal}'>I'm a red box widget.</div>
</ui:UiBinder>
答案 3 :(得分:3)
立即尝试这个我希望你能得到它。
使用<ui:style>
元素,您可以在需要的地方为您的用户界面定义CSS
注意: <ui:style>
元素必须是根元素的直接子元素
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:TextArea visibleLines="3" />
</ui:UiBinder>
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:style field='MyStyle'>
.textBoxStyle {
background-color:yellow;
}
.textBoxStyle-readonly {
background-color:lightgray;
}
</ui:style>
<g:TextArea name="myText" styleName="{MyStyle.textBoxStyle}" visibleLines="3" />
</ui:UiBinder>
答案 4 :(得分:1)
您的UIBinder中是否有拼写错误?
你有:
<g:TextArea styleName="{style.textBoxStyle}" visibleLines="3" />
..但我认为你需要使用“stylePrimaryName”,即
<g:TextArea stylePrimaryName="{style.textBoxStyle}" visibleLines="3" />
但我想这个问题已经得到了回答..
答案 5 :(得分:0)
这里有一些有价值的东西,我把这个帖子中其他帖子的信息放在一起,特别是......
如果使用@external,则可以覆盖gwt样式。问题是这个变化是全球应用的!然而,可以扩展和扩展。覆盖选择属性而不影响窗口小部件类型的每个实例。 (这类似于使用gwt类名+后缀并使用addStyleDependantName()创建css类的编程样式方法。)
以下是使用UIBinder + CssResource扩展gwt样式的示例。我省略了CssResource部分,但你会明白......
在你的xxxx.ui.xml文件中,公开gwt样式,但不要搞乱它!
<ui:style>
@external .gwt-Button; .gwt-Button {}
</ui:style>
然后,通过在styleName属性中指定2个(或更多)样式来设置窗口小部件的样式。即gwt样式,以及资源中的一个(或更多)。
<g:Button ui:field="submitButton_" text="Submit" styleName="{style.gwt-Button} {res.loginStyles.submitButtonStyle}" />
这是css类:
.submitButtonStyle{
margin: 3px 5px 5px 0px;
}
在这种情况下,我定义了一个按标准方法设置样式的按钮(通过模块继承轻松更改)但具有保持固定的特定边距。这并没有搞乱全局风格,它不需要手动定义所有属性,并允许随意使用clean.css,dark.css等交换全局样式。