刚开始整了一个很简单javafx应用,在一台机器正常,换了一台机器,界面上部分汉字显示方框。
private static GraphicsEnvironment environment;
@Override
public void start(Stage primaryStage) throws Exception{
URL location = getClass().getResource("/changeFile.fxml");
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
Parent root = fxmlLoader.load();
ChangeFile cf=(ChangeFile )fxmlLoader.getController();
cf.Init();
//如果使用 Parent root = FXMLLoader.load(...) 静态读取方法,无法获取到Controller的实例对象
//Parent root = FXMLLoader.load(getClass().getResource("/changeFile.fxml"));
Scene scene=new Scene(root, 600, 400);
KeyCombination kc1 = new KeyCodeCombination(KeyCode.X, KeyCombination.ALT_DOWN);;
//其实还是当前线程执行
scene.getAccelerators().put(kc1, () -> System.exit(0));
environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fonts = environment.getAvailableFontFamilyNames();//获得系统字体
int k=0;
for(int i = 0;i<fonts.length;i++){
if(fonts[i].startsWith("Source Han")){
k=2;
}
if(fonts[i].startsWith("Alibaba ")){
k=1;
}
}
if(1==k) {
scene.getStylesheets().add(getClass().getResource("/MainStyle.css").toExternalForm());
}else{
scene.getStylesheets().add(getClass().getResource("/MainStyle2.css").toExternalForm());
}
//设置左上角小图标 注意 不支持ico格式
primaryStage.getIcons().add(new Image("/logo.png"));
primaryStage.setTitle("Hello HarmonyOS");
primaryStage.setScene(scene);
primaryStage.show();
}
因为controller里的java代码用到相应文字正常,就把controller那出外面调用一下init方法,重新设置界面显示文字,结果还不行
比较了2台机器字体,发现缺陷的字体是思源宋体 思源黑体,把免费的阿里普惠体复制到相应机器css文件里设置阿里字体就正常
于是加了代码判断下系统字体,有什么字体用相应css样式文件
再后来,网上搜索一番,是java对思源字体的显示有缺陷,然后把思源字体复制一份到jdk字体文件夹(jdk1.8.0_181/jre/lib/fonts)下,显示就正常了
顺便记一下linux下字体手动复制到/usr/share/fonts下后执行的几个命令
mkfontscale
mkfontdir
fc-cache -fv
fc-list :lang=zh
再记几个免费字体名字,R代表普通规则 B是粗体
阿里普惠体 Alibaba PuHuiTi R
思源宋体 Source Han Serif
oppo字体 OPPOSans R