Java 某些Windows计算机上的JMenu字体奇怪地以粗体显示

Java 某些Windows计算机上的JMenu字体奇怪地以粗体显示,java,swing,Java,Swing,在一些Windows7Pro系统上使用最近的8.xJRE,我们看到一些奇怪的字体行为,不知道它是从哪里来的 除了检索UIManager.getSystemLookAndFeelClassName(),记录它,并调用UIManager.setLookAndFeel(检索到的名称),这个特定的独立应用程序(不是小程序,不是在浏览器或其他“框架”中)与外观设置没有太多关系。我们的目标是让应用程序的行为或多或少像一个本地应用程序,而不是强迫它尝试在任何地方都看起来相同 我们没有料到的是,微软Window

在一些Windows7Pro系统上使用最近的8.xJRE,我们看到一些奇怪的字体行为,不知道它是从哪里来的

除了检索
UIManager.getSystemLookAndFeelClassName()
,记录它,并调用
UIManager.setLookAndFeel(检索到的名称)
,这个特定的独立应用程序(不是小程序,不是在浏览器或其他“框架”中)与外观设置没有太多关系。我们的目标是让应用程序的行为或多或少像一个本地应用程序,而不是强迫它尝试在任何地方都看起来相同

我们没有料到的是,微软Windows系统之间的差异如此之大。从上面提到的日志记录中,我们知道所讨论的L&F是标准的
com.sun.java.swing.plaf.windows.WindowsLookAndFeel
,并且我们知道如果系统属性
swing.useSystemFontSettings
为真(默认值),然后WindowsLookAndFeel应该从magic la la land检索本地字体设置,并优先使用内置L&F字体。在这个过程中,有些事情变得很奇怪

所讨论的代码使用的是标准组件(
newjframe()
newjmenubar()
,一些
newjmenu(“foo”)
),稍后我将尝试发布一个代码片段。以下是大多数Windows系统上的实体模型:

标题字体和菜单字体相同。如果我们检索两个字体对象,它们都报告相同的度量(“Segoe UI”,isBold=false)。好的,很好

将生成的应用程序复制到另一个Windows框中时,它突然看起来如下所示:

现在,与标题相比,菜单字体更重、更暗、更粗体。查询这两种字体时,它们都声称是相同的Segoe普通字体,但它们明显不同。(当显示菜单且每个条目都相同时,差异更为明显。)第二个Windows框没有安装自定义字体,也没有对桌面设置进行奇怪的调整

因此,在WindowsLookAndFeel初始化中,任何由键“
win.menu.font
”表示的内容都将替换默认值。(该属性不存在,但它是la la land查找的编写方式。)除非是这样,否则查询UIManager的
菜单。font
或调用菜单实例上的getFont()将返回更改后的font对象。我们得到的菜单和标题的字体对象完全相同


我们还需要在哪里寻找差异的根源?我们不一定要“修复”它,但我们确实需要能够告诉用户“如果您看到这个,或者如果您想要这个,那么您需要在Windows系统上更改某某”。

标题栏字体的作用似乎正好相反:第一个屏幕截图更粗体,第二个屏幕截图更亮。窗口标题字体不在Java的控制之下这一事实表明您没有做错什么,看到您所看到的是正常的。不过,我不知道为什么它们不同。@VGR我希望我能从第二台计算机上得到一个弹出对话框的屏幕截图,在那里所有的东西都是黑体,这样可能会更明显。(我一有时间就会模拟一个例子。)它有点难看,可能需要“修复”,尽管我最初是这么写的。看起来标题栏字体的作用正好相反:第一个屏幕截图更粗体,第二个屏幕截图更轻。窗口标题字体不在Java的控制之下这一事实表明您没有做错什么,看到您所看到的是正常的。不过,我不知道为什么它们不同。@VGR我希望我能从第二台计算机上得到一个弹出对话框的屏幕截图,在那里所有的东西都是黑体,这样可能会更明显。(我一有时间就会模拟一个例子。)它有点难看,可能需要“修复”,不管我最初写了什么。