Java 在库中设置GWT小部件样式的最佳方法

Java 在库中设置GWT小部件样式的最佳方法,java,css,gwt,widget,Java,Css,Gwt,Widget,我正在将一些小部件开发成一个库,供我工作的公司内部使用 我不知道推荐的小部件样式是什么 至少有以下几种方式: 使用Widget.setPrimaryStyleName并让用户提供外部css。我们使用maven原型构建应用程序,以便提供默认样式。无论如何,我不太喜欢它 使用GWT2.0 CssResourceBundle。因此,我们可以将CSS编译到模块中,并对其进行优化(它也可以依赖于浏览器) 提供具有样式的模块。类似于默认的GWT主题。但我不知道这到底是怎么回事 我想: 尽可能使组件具有

我正在将一些小部件开发成一个库,供我工作的公司内部使用

我不知道推荐的小部件样式是什么

至少有以下几种方式:

  • 使用Widget.setPrimaryStyleName并让用户提供外部css。我们使用maven原型构建应用程序,以便提供默认样式。无论如何,我不太喜欢它

  • 使用GWT2.0 CssResourceBundle。因此,我们可以将CSS编译到模块中,并对其进行优化(它也可以依赖于浏览器)

  • 提供具有样式的模块。类似于默认的GWT主题。但我不知道这到底是怎么回事

我想:

  • 尽可能使组件具有内聚性(不要依赖外部包含的css)
  • 打开门修改样式(如果我想更改某些小部件在具体应用程序中的外观)
你在这方面有什么经验


注意:如果你想要一个明确的答案,请仔细阅读所有答案和评论。有不同的想法,都是好主意。然后选择最适合您的:)

我认为最好的方法是在模块中提供样式。通过这种方式,您将能够轻松地重新设置样式,或为控件添加“主题”

我正在做一个类似的项目,该项目托管在github()上,所以您可能想查看一下。您可以下载jar文件,将其包含在项目中,并在模块xml中指定要使用该样式。。类似

<inherits name='gwt.theme.flick.Flick'/>

我建议你为你的风格使用新的模块,这样你就可以很容易地在风格之间切换。。。(只需更改inherits标记)。因此,例如,如果您的一个小部件使用css类“my widget”,您将拥有一个“样式”模块(或多个模块),该模块将定义该css类(在css文件中)-这样,您可以拥有多个实现该css类的模块,并且在这些模块之间进行切换就像在inherits标记中更改模块名称一样简单。通过这种方式,您将获得一个很好的解耦代码样式,它将独立于小部件的技术实现。如果您还有其他问题,请随时提问


另外,我忘了上面提到的——请密切关注样式模块是如何构建的(build.xml),这有点棘手。您可以在以下网站上找到有关创建模块的更多信息

如果您只是在编写一个新的小部件,并且希望人们能够自定义其css,那么我使用的一种模式是:

public class MyWidget extends Composite {
  public interface MyCss extends CssResource {
    ...
  }

  private static MyCss defaultStyle;
  private static MyCss ensureDefaultStyle() {
    if (defaultStyle == null) {
      defaultStyle = GWT.create(DefaultResourceBundle.class).css();
    }
    return defaultStyle;
  }

  /** If you want to use default style, call this */
  public MyWidget() {
    this(ensureDefaultStyle());
  }

  /** If you want to use your custom style, call this */
  public MyWidget(MyCss css) {
    ...
  }
}

因此,您的小部件库可以提供CSS接口,并为其提供默认实现。如果您的用户想要自定义它,他可以将CSS接口绑定到自己资源包中自己选择的CSS文件,并使用第二个构造函数。

我喜欢模块方法。当我创建一个库时,我还提供了一个样式模块来设置库中小部件的样式。但是我在您的项目中看到的方法是用于GWT中的标准小部件的方法。复制到公共webdir并注入页面的css。我想,我可以使用模糊的方式,甚至与模块。我的意思是:使用UIBinder(或使用CssResource/@Source)并在样式模块中引用css。我认为它可以工作。提供模块化和CSS样式名称混淆。。。我试试看!:)谢谢不间断电源!我把模块和罐子搞混了。。。我得回顾一下我的想法:)是的,我也认为这应该行得通。我只是没有使用这个CssResource/Source方法,因为您需要能够将我的样式应用到现有的GWT小部件上——而且,最终,它们不使用CssResources.Yep。但是如果我想使用一个模块来定义要使用的样式。。。该模块必须包含样式实现(css文件)。我目前的想法是让“样式模块”xml定义源目录。因此,如果包含一个或另一个样式模块,它将具有不同的源路径,并使用(在css编译中)不同的css源文件。我答应在午夜前试一试!:)我不知道你为什么需要一个模块来决定使用哪个模块。。。也许一个可接受的解决方案是您决定(通过在模块的xml中指定)要使用哪种样式。。。我不确定您是需要在运行时更改样式,还是只需要在编译时更改样式。无论如何,我认为它可以被修改以进行全局样式更改(如主题)。可能正在创建一个“全局”cssresource(或捆绑包)。。。LibraryUtilityClass.setCssBundle(mybundle)。。。