Java二进制兼容性问题:sun.font.FontManager类成为接口



我正在使用Lobo-Java Web浏览器库,它给了我一个例外,经过一些研究,我确定这可能是因为该库是根据旧版本的Java编写的。

代码如下:

import java.io.IOException;
import org.lobobrowser.html.UserAgentContext;
import org.lobobrowser.html.parser.DocumentBuilderImpl;
import org.lobobrowser.html.parser.InputSourceImpl;
import org.lobobrowser.html.test.SimpleUserAgentContext;
import org.xml.sax.SAXException;
public class Cobratest
{
    public static void main(String[] args) throws SAXException, IOException
    {
        UserAgentContext uAgent = new SimpleUserAgentContext();
        DocumentBuilderImpl docBuild = new DocumentBuilderImpl(uAgent);
        docBuild.parse(new InputSourceImpl("http://dic.amdz.com/"));
    }
}

堆栈跟踪为:

 Exception in thread "main" java.lang.IncompatibleClassChangeError: Found interface sun.font.FontManager, but class was expected
    at org.lobobrowser.util.gui.FontFactory.createFont(FontFactory.java:210)
    at org.lobobrowser.util.gui.FontFactory.createFont_Impl(FontFactory.java:180)
    at org.lobobrowser.util.gui.FontFactory.createFont(FontFactory.java:127)
    at org.lobobrowser.util.gui.FontFactory.getFont(FontFactory.java:98)
    at org.lobobrowser.html.style.StyleSheetRenderState.<clinit>(StyleSheetRenderState.java:43)
    at org.lobobrowser.html.domimpl.NodeImpl.<clinit>(NodeImpl.java:39)
    at org.lobobrowser.html.parser.DocumentBuilderImpl.createDocument(DocumentBuilderImpl.java:143)
    at org.lobobrowser.html.parser.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:97)

当我检查org.lobobrowser.util.gui.FontFactory.createFont时,我发现有一个名为FontManager的接口,它与以前的Java版本不同。在这个FontFactory类中,他们使用了一个不再可用的接口类。如何解决此问题?

接口FontManager:

package sun.font;
import java.awt.Font;
import java.awt.FontFormatException;
import java.io.File;
public interface FontManager {
    public static final int NO_FALLBACK = 0;
    public static final int PHYSICAL_FALLBACK = 1;
    public static final int LOGICAL_FALLBACK = 2;
    public boolean registerFont(Font font);
    public void deRegisterBadFont(Font2D font2d);
    public Font2D findFont2D(String string, int i, int i1);
    public Font2D createFont2D(File file, int i, boolean bln, CreatedFontTracker cft) throws FontFormatException;
    public boolean usingPerAppContextComposites();
    public Font2DHandle getNewComposite(String string, int i, Font2DHandle fdh);
    public void preferLocaleFonts();
    public void preferProportionalFonts();
}

以及库中使用的不可用的类:

   return FontManager.getCompositeFontUIResource(new Font(name, style, size));

我认为'sun.font.FontManager'在Java7中被删除了,所以如果你必须使用它(我建议你不要使用它,而是寻找另一个包),你可以尝试用java6运行它。

LoboBrowser项目已被LoboEvolution取代,但有一个补丁是针对过时的LoboBrowser实现而提到的。

更新FontFactory.java以导入公共方法,并按如下方式修改createFont方法:

import static javax.swing.text.StyleContext.*;
private Font createFont(String name, int style, int size) {
  return getDefaultStyleContext().getFont(name, style, size);
}

javax.swing.text.StyleContext.getDefaultStyleContext.getFont可能适用于JDK的各个版本。

详见http://elliotth.blogspot.com.au/2007/04/far-east-asian-fonts-with-java-7-on.html

最新更新