据我所知,在运行时无法更改 uibinder 模板(因为它在编译时被编译成 javascript 并且在运行时不再可访问)。
您可能必须手动更改 gwt 代码中的颜色(= 在 java 文件中,而不是在 .xml 文件中)。
直截了当:
- 创建用于存储颜色信息的数据库结构
- 创建服务器代码以从数据库中获取颜色
- 实现 gwt-service(以及异步接口和 servlet 实现类)以将颜色信息传递给客户端
-
实现 gwt 客户端代码,它会询问颜色信息,然后为您的 gwt 组件设置颜色。您可以这样做(使用 http://www.francoismaillet.com/blog/?p=68 中描述的驼峰式案例):
widget.getElement().getStyle().setProperty("background", colorValueFromDatabase);
当然,当需要更改大量小部件时,此解决方案非常不方便。
备选方案 1:
实现一个普通的旧 Java Servlet(没有 gwt),它可以提供一个 css 文件(一个标准的 servlet,它从数据库加载颜色数据并将该颜色作为 css 定义返回给浏览器)。在 gwt-html 起始页中使用指向该 Servlet 的链接。
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CssServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// you somehow have to get your user's information out of the session
User user = (User) request.getSession().getAttribute("loggedInUser");
PrintWriter writer = response.getWriter();
// use saved color values and generate css
writer.append(".header {");
writer.append(" background: " + getHeaderColorForUser(user) + ";");
writer.append(" padding: 6px 6px;");
writer.append(" }");
writer.append(" .anothercssclass {");
writer.append(" background: " + getAnotherCssClassColorForUser(user) + ";");
writer.append(" padding: 6px 6px;");
writer.append(" }");
// finish request
writer.close();
response.setStatus(HttpServletResponse.SC_OK);
}
private String getAnotherCssClassColorForUser(User user) {
// TODO Auto-generated method stub
return null;
}
private String getHeaderColorForUser(User user) {
// TODO Auto-generated method stub
return null;
}
}
这种替代方法的问题是,您无法立即刷新颜色信息。用户必须重新加载页面才能看到他的颜色样式的变化。
备选方案 2:
使用 javascript(本机代码)动态更改您的 css 配置。
// in java code:
changeCssStyle("header", "background", colorFromDatabase);
和
private native void changeCssStyle(String cssClass, String cssName, String cssValue)
/*-{
var children = document.getElementsByTagName('*') || document.all;
var elements = new Array();
// iterate over ALL elements
for (i in children) {
var child = children[i];
var classNames = child.className.split(' ');
for (c in classNames) {
// does this element use our css class?
if (classNames[c] == '.' + cssClass) {
// now modify this element: set the attribute with name "cssName" to the value "cssValue"
child.style.setAttribute(cssName, cssValue);
}
}
}
}-*/
;
结论
解决您的问题的三种解决方法,其中没有一个是真正的解决方案 - 但希望它可以帮助您实现代码。祝你好运!
PS:我的代码未经测试...