我尝试使用从Eclipse或命令行运行的Linux上的Oracle JVM(1.7u13)(我有正确版本的GTK)来运行一个非常简单的JavaFX程序。当它开始时它抛出了关于字体的异常呻吟。 Font.getDefault()也可以导致相同的NPE。我可以使用Font.getFontNames()列出可用的字体,我可以看到包含' System Regular'我以为是默认的。
任何想法都非常感激!
堆栈跟踪....
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403) at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47) at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115) at java.lang.Thread.run(Thread.java:722) Caused by: java.lang.NullPointerException at com.sun.t2k.LogicalFont.(LogicalFont.java:172) at com.sun.t2k.LogicalFont.getLogicalFont(LogicalFont.java:104) at com.sun.t2k.LogicalFont.getLogicalFont(LogicalFont.java:144) at com.sun.t2k.T2KFontFactory.createFont(T2KFontFactory.java:356) at com.sun.prism.j2d.J2DFontFactory.createFont(J2DFontFactory.java:38) at com.sun.javafx.font.PrismFontLoader.loadFont(PrismFontLoader.java:399) at javafx.scene.text.Font.(Font.java:282) at javafx.scene.text.Font.getDefault(Font.java:85) at com.me.FXProblem.start(FXProblem.java:23) at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319) at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76) at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) at com.sun.glass.ui.gtk.GtkApplication$3$1.run(GtkApplication.java:82) ... 1 more
获取错误的示例代码。我假设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();
}
}
答案 0 :(得分:2)
看起来像JavaFX 2.2的已知(当前开放)问题:
RT-28405 NPE when trying to load default font on Slackware linux
使用上述错误跟踪链接需要登录,但任何人都可以注册。
重现(仅复制和过去)此处问题的一些评论,以便临时用户无需注册错误跟踪器即可访问它们:
用户提交的解决方法
我设法解决了这个问题,只需在/ usr / share / fonts中添加一个TTF目录,并在该目录中添加至少.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)但我同意你的评估,安装新字体来解决这个问题没什么大不了的,只是很难弄清楚那就是问题所在。 (因为我们确实安装了其他字体)如果您能够检测到这个问题并提供更好的反馈,那么从我的角度来看这是可以接受的。谢谢!