3

我正在尝试使用从 Eclipse 或命令行运行的 Linux(我有正确版本的 GTK)上的 Oracle JVM(1.7u13)运行一个非常简单的 JavaFX 程序。当它开始时,它会抛出一个关于字体的异常抱怨。Font.getDefault() 也可能导致相同的 NPE。我可以使用 Font.getFontNames() 列出可用的字体,我可以看到 17 种字体,包括我认为是默认设置的“系统常规”。

任何想法都非常感谢!

堆栈跟踪....

    线程“主”java.lang.RuntimeException 中的异常:应用程序启动方法中的异常
        在 com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403)
        在 com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47)
        在 com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115)
        在 java.lang.Thread.run(Thread.java:722)
    引起:java.lang.NullPointerException
        在 com.sun.t2k.LogicalFont.(LogicalFont.java:172)
        在 com.sun.t2k.LogicalFont.getLogicalFont(LogicalFont.java:104)
        在 com.sun.t2k.LogicalFont.getLogicalFont(LogicalFont.java:144)
        在 com.sun.t2k.T2KFontFactory.createFont(T2KFontFactory.java:356)
        在 com.sun.prism.j2d.J2DFontFactory.createFont(J2DFontFactory.java:38)
        在 com.sun.javafx.font.PrismFontLoader.loadFont(PrismFontLoader.java:399)
        在 javafx.scene.text.Font.(Font.java:282)
        在 javafx.scene.text.Font.getDefault(Font.java:85)
        在 com.me.FXProblem.start(FXProblem.java:23)
        在 com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
        在 com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215)
        在 com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179)
        在 com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176)
        在 java.security.AccessController.doPrivileged(本机方法)
        在 com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176)
        在 com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76)
        在 com.sun.glass.ui.gtk.GtkApplication._runLoop(本机方法)
        在 com.sun.glass.ui.gtk.GtkApplication$3$1.run(GtkApplication.java:82)
        ... 1 更多

更新

获取错误的示例代码。我假设 Font.getDefault() 的路由原因是导致几个非常简单的 UI 节点不显示的原因。


    package com.me;

    import javafx.application.Application;
    import javafx.scene.text.Font;
    import javafx.stage.Stage;

    /**
     * Problem class to show the stack trace from Font.getDefault()
     */
    public class FXProblem extends Application
    {
        /**
         * {@inheritDoc}
         */
        @Override
        public void start(final Stage stage) throws Exception
        {
            Font.getDefault();
        }

        /**
         * Main.
         */
        public static void main(final String[] args)
        {
            launch();
        }
    }
    
4

1 回答 1

2

看起来像 JavaFX 2.2 的一个已知(当前打开)问题:

尝试在 Slackware linux 上加载默认字体时出现 RT-28405 NPE

使用上述错误跟踪链接需要登录,但任何人都可以注册。


复制(只是复制和过去)这里问题的一些评论,这样临时用户不需要注册错误跟踪器就可以访问它们:

用户提交的解决方法

我设法通过简单地将 TTF 目录添加到 /usr/share/fonts 并将至少一个 .ttf 文件添加到该目录来解决这个问题。(/usr/share/fonts/TTF/somefont.ttf) 以前 /usr/share/fonts 中唯一的其他目录是 Type1。(/usr/share/fonts/Type1)

开发者提供的背景信息

由于向 /usr/share/fonts 添加 TTF 字体是可行的,因此我们似乎成功地使用 /usr/libfontconfig 来定位已安装的字体,但显然没有我们喜欢的字体。即 FX 不支持 Type 1 字体(政策决定),仅支持 TrueType 和 OpenType/CFF 字体。您使用的是 OpenJDK 还是 Oracle JDK?我敢打赌,与 slackware OpenJDK 捆绑在一起的 OpenJDK 没有自己的字体,而 OracleJDK 有一些自己的 TrueType 字体,所以不会遇到这个问题。这里的底线似乎是您应该安装一套像样的 TrueType 字体。我认为我们唯一能做的就是在发生这种情况时改进诊断。

用户提供的环境信息

我使用的是 Oracle 的 JDK,所以我很惊讶地遇到了这个问题。( 7u10 ) 但我同意你的评估,安装新字体来解决这个问题没什么大不了的,只是很难弄清楚这就是问题所在。(因为我们确实安装了其他字体)如果您能检测到这个问题并提供更好的反馈,从我的角度来看,这是可以接受的。谢谢!

于 2013-02-20T20:17:35.773 回答