我有一个使用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("i18n", 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个案例:
测试使用oracle java 8u141,32或64位,windows 7 64bit,linux debian 7 64 bit,firefox 的的java
如果我将客户端称为java应用程序,修复工作正常
javaws [url]
这个调用在linux和windows中运行良好。 但是在jnlp文件的旧版本中,我们使用扩展来包含第三方JAR,并且在Windows中,这个调用工作一次,直到我删除缓存的文件
javaws [本地文件]
不起作用
浏览器
不起作用
为什么系统属性不起作用的任何建议?
答案 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);
}
}