java webstart System.getProperties()或Syste.setProperties()被忽略

时间:2017-09-06 08:24:09

标签: java swing java-web-start java-security

我有一个使用JXLayer和pbjar-Framework的可缩放UI的java swing项目。使用TransformUI.java中的以下方法修复了JTextComponents的问题:

/**
 * {@link JTextComponent} and its descendants have some caret position
 * problems when used inside a transformed {@link JXLayer}. When you plan to
 * use {@link JTextComponent}(s) inside the hierarchy of a transformed
 * {@link JXLayer}, call this method in an early stage, before instantiating
 * any {@link JTextComponent} .
 * <p>
 * It executes the following method:
 * 
 * <pre>
 * System.setProperty(&quot;i18n&quot;, Boolean.TRUE.toString());
 * </pre>
 * 
 * As a result, a {@link GlyphPainter} will be selected that uses floating
 * point instead of fixed point calculations.
 * </p>
 */
public static void prepareForJTextComponent() {
  System.setProperty("i18n", Boolean.TRUE.toString());
}

所有JAR都使用有效证书进行签名,jnlp看起来像

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="7.0+" codebase="https://__HOST_IP____HOST_HTTPS_PORT__/test"
  href="client/1024.jnlp">
  <information>
    <offline-allowed />
  </information>
  <security>
    <all-permissions />
  </security>
  <resources>
    <j2se version="1.8+" java-vm-args="-Xmx512M" />
    <jar href="client.jar" />
    ... more JARs
  </resources>
  <application-desc main-class="de.test.Frame">
    <argument>__HOST_IP__</argument>
  </application-desc>
</jnlp>

client.jar MANIFEST.MF包含以下

...
Permissions: all-permissions
Codebase: *
Trusted-Only: false
Trusted-Library: false
...

因为javaws只接受我在主类中调用的安全属性

static
{
  TransformUI.prepareForJTextComponent();
}

问题是,如果我每个浏览器使用Java webstart,则JTextComponent的修复程序不起作用。

对于java webstart,我测试了4个案例:

  1. java
  2. javaws [url]
  3. javaws [本地文件]
  4. 浏览器
  5. 测试使用oracle java 8u141,32或64位,windows 7 64bit,linux debian 7 64 bit,firefox 的的java

    如果我将客户端称为java应用程序,修复工作正常

    javaws [url]

    这个调用在linux和windows中运行良好。 但是在jnlp文件的旧版本中,我们使用扩展来包含第三方JAR,并且在Windows中,这个调用工作一次,直到我删除缓存的文件

    javaws [本地文件]

    不起作用

    浏览器

    不起作用

    为什么系统属性不起作用的任何建议?

1 个答案:

答案 0 :(得分:0)

在javax.swing.text.AbstractDocument.AbstractDocument(Content,AttributeContext)中SystemProperty&#34; i18n&#34;被催促:

...
if (defaultI18NProperty == null) {
  // determine default setting for i18n support
  String o = java.security.AccessController.doPrivileged(
    new java.security.PrivilegedAction<String>() {
      public String run() {
        return System.getProperty(I18NProperty);
      }
    }
  );
  if (o != null) {
    defaultI18NProperty = Boolean.valueOf(o);
  } else {
    defaultI18NProperty = Boolean.FALSE;
  }
}
putProperty( I18NProperty, defaultI18NProperty);
....

在我的情况下,财产应该始终设置&#34; true&#34;所以我使用自己的JTextField类:

class MyTextField extends JTextField {
  MyTextField() {
    super();
    Document doc = new PlainDocument();
    doc.putProperty("i18n", Boolean.TRUE);
    this.setDocument(doc);
  }
}