[编辑:我突然想到我在对主题有很多认识之前就想出了这个“解决方案”。下次我处理这个问题时,我将检查在 Windows 和 Mac/Linux 上显式地使主题相同(而不是允许它们各自的默认值)是否消除了这个问题。]
我很失望地发现著名的“一次编写——到处运行”程序有这个相当大的缺陷。我希望有一种更优雅的方式来处理它,或者我遗漏或误解的东西,但现在我正在为给定的操作系统指定大小。据我所知,只有两种操作系统的缩放大小需要适应:一方面是 Windows,另一方面是 Linux/Mac。
如果只有一两个尺寸需要调整,可以使用以下方法:
String os = System.getProperty("os.name","generic").toLowerCase(Locale.US);
if (os.indexOf("mac") > 0) {
root.setStyle("-fx-font-size: 14pt");
}
在这种情况下,Windows 默认字体的大小为 10pt,而我的 Mac 用户想要更大的字体,而该程序并没有被广泛分发。一旦在场景图的基础上为组设置了样式(我通常将其命名为“根”),它将与整个图相关,除非被覆盖。
但对于更复杂的情况,我使用了类似以下静态类的东西。当我分发应用程序时,通常作为自包含程序(使用 JLINK),操作系统是已知的,可以在文件顶部设置。我还不如只发布整个班级。您可能会有不同的细节,或多或少需要调整的东西。
如果有更好的方法来处理这个问题,我会全力以赴。
import java.awt.Font;
import java.awt.Insets;
/**
* This file contains values needed that pertain to the
* difference in the size relationships of fonts:pixels in
* Mac OS and Windows.
*
* @author Phil Freihofner
*/
public class OSConstants {
public enum OS {WIN, MAC_LINUX};
public static OS os;
{
// os = OS.WIN;
os = OS.MAC_LINUX;
}
public static Font tinySizeFont;
public static Font smallSizeFont;
public static Font normalSizeFont;
public static Font largeSizeFont;
public static Font bigLabelFont;
public static Font cboChoicesFont;
public static Font buttonFont;
public static int preferenceButtonSpacer;
public static Insets gridButtonInsets;
public static Insets gridCBOInsets;
public static Insets gridLabelInsets;
public static Insets gridRadioInsets;
public static Insets gridSliderInsets;
private final int MAC_TINY_FONT_SIZE = 7;
private final int MAC_SMALL_FONT_SIZE = 8;
private final int MAC_CBO_FONT_SIZE = 10;
private final int MAC_NORMAL_FONT_SIZE = 11;
private final int MAC_LARGE_FONT_SIZE = 15;
private final int MAC_BIG_LABEL_FONT_SIZE = 20;
private final int MAC_PREFERENCE_BUTTON_SPACER = -16;
private final Insets MAC_GRID_BUTTON_INSETS = new Insets(-1, -1, -1, -1);
private final Insets MAC_GRID_CBO_INSETS = new Insets(-1, -1, -1, -2);
private final Insets MAC_GRID_LABEL_INSETS = new Insets(-1, -1, -1, -1);
private final Insets MAC_GRID_RADIO_INSETS = new Insets(-1, -1, -1, -1);
private final Insets MAC_GRID_SLIDER_INSETS = new Insets(-1, -1, -1, -1);
private final int WIN_TINY_FONT_SIZE = 8;
private final int WIN_SMALL_FONT_SIZE = 9;
private final int WIN_CBO_FONT_SIZE = 11;
private final int WIN_NORMAL_FONT_SIZE = 12;
private final int WIN_LARGE_FONT_SIZE = 16;
private final int WIN_BIG_LABEL_FONT_SIZE = 24;
private final int WIN_PREFERENCE_BUTTON_SPACER = -22;
private final Insets WIN_GRID_BUTTON_INSETS = new Insets(2, 2, 2, 2);
private final Insets WIN_GRID_CBO_INSETS = new Insets(2, 2, 2, 2);
private final Insets WIN_GRID_LABEL_INSETS = new Insets(2, 2, 2, 2);
private final Insets WIN_GRID_RADIO_INSETS = new Insets(2, 10, 2, 2);
private final Insets WIN_GRID_SLIDER_INSETS = new Insets(2, 2, 2, 2);
OSConstants()
{
if (os == OS.WIN)
{
tinySizeFont = new Font(Font.SANS_SERIF, Font.PLAIN, WIN_TINY_FONT_SIZE);
smallSizeFont = new Font(Font.SANS_SERIF, Font.PLAIN, WIN_SMALL_FONT_SIZE);
normalSizeFont = new Font(Font.SANS_SERIF, Font.BOLD, WIN_NORMAL_FONT_SIZE);
largeSizeFont = new Font(Font.SANS_SERIF, Font.BOLD, WIN_LARGE_FONT_SIZE);
bigLabelFont = new Font(Font.SERIF, Font.BOLD, WIN_BIG_LABEL_FONT_SIZE);
cboChoicesFont = new Font(Font.SANS_SERIF, Font.BOLD, WIN_CBO_FONT_SIZE);
buttonFont = new Font(Font.SANS_SERIF, Font.BOLD, WIN_NORMAL_FONT_SIZE);
preferenceButtonSpacer = WIN_PREFERENCE_BUTTON_SPACER;
gridButtonInsets = WIN_GRID_BUTTON_INSETS;
gridCBOInsets = WIN_GRID_CBO_INSETS;
gridLabelInsets = WIN_GRID_LABEL_INSETS;
gridRadioInsets = WIN_GRID_RADIO_INSETS;
gridSliderInsets = WIN_GRID_SLIDER_INSETS;
}
else if (os == OS.MAC_LINUX)
{
tinySizeFont = new Font(Font.SANS_SERIF, Font.PLAIN, MAC_TINY_FONT_SIZE);
smallSizeFont = new Font(Font.SANS_SERIF, Font.PLAIN, MAC_SMALL_FONT_SIZE);
normalSizeFont = new Font(Font.SANS_SERIF, Font.BOLD, MAC_NORMAL_FONT_SIZE);
largeSizeFont = new Font(Font.SANS_SERIF, Font.BOLD, MAC_LARGE_FONT_SIZE);
bigLabelFont = new Font(Font.SERIF, Font.BOLD, MAC_BIG_LABEL_FONT_SIZE);
cboChoicesFont = new Font(Font.SANS_SERIF, Font.BOLD, MAC_CBO_FONT_SIZE);
buttonFont = new Font(Font.SANS_SERIF, Font.BOLD, MAC_NORMAL_FONT_SIZE);
preferenceButtonSpacer = MAC_PREFERENCE_BUTTON_SPACER;
gridButtonInsets = MAC_GRID_BUTTON_INSETS;
gridCBOInsets = MAC_GRID_CBO_INSETS;
gridLabelInsets = MAC_GRID_LABEL_INSETS;
gridRadioInsets = MAC_GRID_RADIO_INSETS;
gridSliderInsets = MAC_GRID_SLIDER_INSETS;
}
}
}