我正在尝试在Linux(我有正确版本的GTK)上使用Oracle JVM(1.7u13)运行一个非常简单的JavaFX程序,该程序从Eclipse或命令行运行。当它开始时,它抛出了一个例外,抱怨字体。字体。getDefault()也会导致相同的NPE。我可以使用字体列出可用的字体。getFontNames(),我可以看到17个,包括我认为是默认的“系统规则”。
任何想法非常感谢!
堆栈跟踪....
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.get默认()的路由原因是导致几个非常简单的用户界面节点不显示的原因。
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();
}
}
看起来像JavaFX 2.2的一个已知(当前打开的)问题:
尝试在Slackware linux上加载默认字体时出现RT-28405 NPE
使用上述错误跟踪器链接需要登录,但任何人都可以注册。
在此处复制(仅复制并粘贴)问题中的一些评论,以便临时用户无需注册错误跟踪器即可访问它们:
用户提交的解决方案
我已经设法解决了这个问题,只需在/usr/share/fonts中添加一个TTF目录,并在。ttf文件复制到该目录。(/usr/share/fonts/TTF/some font . TTF)以前,/usr/share/fonts中唯一的其他目录是Type1。(/usr/share/fonts/Type1)
开发者提供的背景资料
自从添加TTF字体到 /usr/share/fonts工作,那么我们似乎成功地使用 /usr/libfontconfig来定位已安装的字体,但显然没有我们喜欢的字体。即FX不支持类型1字体(策略决定),只支持TrueType和OpenType/CFF字体。您是使用OpenJDK还是Oracle JDK运行?我敢打赌,与sackware捆绑的OpenJDK没有自己的字体,而OracleJDK有一些自己的TrueType字体,因此不会遇到这个问题。这里的底线似乎是您应该安装一组不错的TrueType字体。我认为我们唯一能做的就是在这种情况发生时改善对角线。
用户提供的环境信息
我使用的是Oracle的JDK,所以我很惊讶地遇到了这个。(7u10)但是我同意你的评估,安装新字体来解决这个问题没什么大不了的,只是很难弄清楚这就是问题所在。(因为我们确实安装了其他字体)如果你能检测到这个问题并提供更好的反馈,从我的角度来看,这是可以接受的。谢谢!