1

我需要在我的面板上显示工作目录。

我用String value = System.getProperty("user.dir"). 之后我将此字符串放在标签上,但我在控制台上收到此消息:

The method getProperty(String, String) in the type System is not applicable for the arguments (String).

我使用日食。

4

2 回答 2

6

问题

我猜你还没有经历过 GWT 101 - 你不能盲目地在客户端使用 JAVA CODE。

解释

您可以从 JAVA 中找到 GWT 支持的类和方法的列表。 https://developers.google.com/web-toolkit/doc/latest/RefJreEmulation

对于 System,仅支持以下内容。

err, out,
System(), 
arraycopy(Object, int, Object, int, int), 
currentTimeMillis(), 
gc(), 
identityHashCode(Object), 
setErr(PrintStream),
setOut(PrintStream)

解决方案

在您的情况下,在您的服务器端代码中执行 System.getProperty("user.dir") 并使用 RPC 或任何其他服务器端 gwt 通信技术访问它。

于 2013-01-08T18:34:55.653 回答
1

不支持 System.getProperty("key"),但支持 System.getProperty("key", "default"),尽管它只会返回默认值,因为本身没有系统属性。

如果在 gwt 编译期间需要工作目录,则需要使用自定义链接器或生成器,在构建时获取系统属性,并将其作为公共资源文件发出。

对于链接器,您必须导出 gwt 可以下载的外部文件并获取所需的编译时数据。对于生成器,您只需将所需的字符串注入编译的源代码。

这是一个关于链接器的幻灯片,实际上非常有趣。
http://dl.google.com/googleio/2010/gwt-gwt-linkers.pdf

如果您不想使用链接器和额外的 http 请求,您也可以使用生成器,这可能更容易(而且更快):

interface BuildData {
  String workingDirectory();
}
BuildData data = GWT.create(BuildData.class);
data.workingDirectory();

然后,您需要制作一个生成器:

public class BuildDataGenerator extends IncrementalGenerator {
  @Override
 public RebindResult generateIncrementally(TreeLogger logger, 
     GeneratorContext context, String typeName){
  //generator boilerplate
  PrintWriter printWriter = context.tryCreate(logger, "com.foo", "BuildDataImpl");
  if (printWriter == null){
    logger.log(Type.TRACE, "Already generated");
    return new RebindResult(RebindMode.USE_PARTIAL_CACHED,"com.foo.BuildDataImpl");
  }
  SourceFileComposerFactory composer =
      new SourceFileComposerFactory("com.foo", "BuildDataImpl");
  //must implement interface we are generating to avoid class cast exception
  composer.addImplementedInterface("com.foo.BuildData");
  SourceWriter sw = composer.createSourceWriter(printWriter);
  //write the generated class; the class definition is done for you
  sw.println("public String workingDirectory(){");
  sw.println("return \""+System.getProperty("user.dir")+"\";");
  sw.println("}");
  return new RebindResult(RebindMode.USE_ALL_NEW_WITH_NO_CACHING
       ,"com.foo.BuildDataImpl");

  }
}

最后,您需要告诉 gwt 在您的界面上使用您的生成器:

<generate-with class="dev.com.foo.BuildDataGenerator">
    <when-type-assignable class="com.foo.BuildData" />
</generate-with>
于 2013-01-09T00:07:47.247 回答