有辦法更改Java程式的預設字型嗎?

有關於X 環境當中所遇到的問題

Moderator: Forums Team

Jackie
Posts: 137
Joined: Sat Jul 08, 2006 10:13 pm

有辦法更改Java程式的預設字型嗎?

Post by Jackie »

最近發現Java程式在我的機器上預設的字型是不能顯示中文和日文的
我的fontconfig/Qt/GTK+的設定應該是沒問題
因為Qt和GTK+的程式都很正常

目前的問題是如果該隻Java程式有支援設定字型改一下就還好
可是如果沒有的話就糟了
所以想知道有沒有辦法改正整個系統中的Java程式的預設字型

這問題困擾我很久了
Google過但是沒找到確切的解決方案

我的JRE是sun-jdk和icedtea6-bin

下面是我為了測試寫的一個Java程式
http://ku.myftp.org/~jackie/UnicodeTest.tar.bz2

我的情況是如果移除掉 UnicodeTestFrame.java 裡的

Code: Select all

helloList.setFont(new Font("Microsoft JhengHei", Font.PLAIN, 16));
視窗右邊的方塊就不能正常顯示文字了
Jackie
Posts: 137
Joined: Sat Jul 08, 2006 10:13 pm

Re: 有辦法更改Java程式的預設字型嗎?

Post by Jackie »

自問自答
如果用sun-jdk的話似乎要修改 /opt/sun-jdk-*/jre/lib/fontconfig.properties
不過我看了她預設值
中文的話他預設是用arphicfonts

而且這檔案改起來似乎相當麻煩 囧
kingctx530
Posts: 121
Joined: Sun Feb 05, 2006 10:30 pm
Location: 地獄

Re: 有辦法更改Java程式的預設字型嗎?

Post by kingctx530 »

Jackie wrote:自問自答
如果用sun-jdk的話似乎要修改 /opt/sun-jdk-*/jre/lib/fontconfig.properties
不過我看了她預設值
中文的話他預設是用arphicfonts

而且這檔案改起來似乎相當麻煩 囧
這個不是很容易找的到嗎...??
到sun-jdk-*/jre/lib/底下建立一個fallback的資料夾
再把你的字型檔link過來就能用了吧...我跑netbeans都是這樣.....不然就會口口 ,我一般都用wqy-zenhei的字型 :102.gif:
我相信末來掌握在自己手上
jojoyakira
Posts: 284
Joined: Thu Mar 01, 2007 10:42 pm
Location: kaohsiung

Re: 有辦法更改Java程式的預設字型嗎?

Post by jojoyakira »

Jackie wrote:自問自答
如果用sun-jdk的話似乎要修改 /opt/sun-jdk-*/jre/lib/fontconfig.properties
不過我看了她預設值
中文的話他預設是用arphicfonts

而且這檔案改起來似乎相當麻煩 囧
我的觀念也是改 /opt/sun-jdk-*/jre/lib/fontconfig.properties ,就是因為麻煩,所以得過且過之下也就不改了。 :101.gif:
kingctx530 wrote: 這個不是很容易找的到嗎...??
到sun-jdk-*/jre/lib/底下建立一個fallback的資料夾
再把你的字型檔link過來就能用了吧...我跑netbeans都是這樣.....不然就會口口 ,我一般都用wqy-zenhei的字型 :102.gif:
剛剛小弟我依照kingctx530兄提供的方法試了一下,發現開http://www.playok.com/下的board game黑白棋,照樣一堆口口,看樣子非得要改fontconfig.properties不可。..........Orz

原本很興奮說....... :oops:
Desktop:Intel Pentium(R) Dual-Core CPU E5300 @ 2.60GHz,OS: Gentoo GNU/Linux
kingctx530
Posts: 121
Joined: Sun Feb 05, 2006 10:30 pm
Location: 地獄

Re: 有辦法更改Java程式的預設字型嗎?

Post by kingctx530 »

jojoyakira wrote:
Jackie wrote:自問自答
如果用sun-jdk的話似乎要修改 /opt/sun-jdk-*/jre/lib/fontconfig.properties
不過我看了她預設值
中文的話他預設是用arphicfonts

而且這檔案改起來似乎相當麻煩 囧
我的觀念也是改 /opt/sun-jdk-*/jre/lib/fontconfig.properties ,就是因為麻煩,所以得過且過之下也就不改了。 :101.gif:
kingctx530 wrote: 這個不是很容易找的到嗎...??
到sun-jdk-*/jre/lib/底下建立一個fallback的資料夾
再把你的字型檔link過來就能用了吧...我跑netbeans都是這樣.....不然就會口口 ,我一般都用wqy-zenhei的字型 :102.gif:
剛剛小弟我依照kingctx530兄提供的方法試了一下,發現開http://www.playok.com/下的board game黑白棋,照樣一堆口口,看樣子非得要改fontconfig.properties不可。..........Orz

原本很興奮說....... :oops:
首先先向Jackie你說聲抱歉..早上剛睡醒....說明少打了一個資料夾..現在你可以這麼做 :oops:

Code: Select all

mkdir /opt/sun-jdk-1.6.0.17/jre/lib/fonts/fallback
cd /opt/sun-jdk-1.6.0.17/jre/lib/fonts/fallback
ln -s /usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc .
晚點補上圖好了,我的gimp還沒有安裝 :106.gif:
我相信末來掌握在自己手上
kingctx530
Posts: 121
Joined: Sun Feb 05, 2006 10:30 pm
Location: 地獄

Re: 有辦法更改Java程式的預設字型嗎?

Post by kingctx530 »

下圖為沒加入字型時的圖
沒有字型檔時java的中文字圖
沒有字型檔時java的中文字圖
nottf_java.png (47.6 KiB) Viewed 27790 times
下圖為加入字型時的圖
加入字型檔後的java中文字圖
加入字型檔後的java中文字圖
havettf_java.png (68.97 KiB) Viewed 27790 times
下圖為playok webgame的圖
playok的遊戲圖
playok的遊戲圖
webgame_java.png (27.52 KiB) Viewed 27790 times
我相信末來掌握在自己手上
jojoyakira
Posts: 284
Joined: Thu Mar 01, 2007 10:42 pm
Location: kaohsiung

Re: 有辦法更改Java程式的預設字型嗎?

Post by jojoyakira »

可以了,感謝kingctx530兄。< (_ _) >
這個方法真是太棒了。 :D
小弟這邊的情況是加入/opt/sun-jdk-1.6.0.17/jre/lib/fonts後,無效.....。 :101.gif:

Code: Select all

 $ cd /opt/sun-jdk-1.6.0.17/jre/lib/fonts
 $ sudo ln -sfn /usr/share/fonts/wqy-zenhei fallback
索性再加入/opt/sun-jre-bin-1.6.0.17/lib/fonts後,就成功了。 :D

Code: Select all

 $ cd /opt/sun-jre-bin-1.6.0.17/lib/fonts
 $ sudo ln -sfn /usr/share/fonts/wqy-zenhei fallback
最後,小弟研究了一下,發現問題應該出在eselect java-nsplugin上,以下是我的設置:
java-config:
  • $ java-config -f
    sun-jdk-1.6
  • $ java-config-2 -f
    sun-jdk-1.6
eselect:
  • $ eselect java-vm list
    Available Java Virtual Machines:
    [1] sun-jdk-1.6 system-vm user-vm
    [2] sun-jre-bin-1.6
  • $ eselect java-nsplugin list
    Available Java browser plugins
    [1] sun-jdk-1.6
    [2] sun-jdk-1.6-plugin2
    [3] sun-jre-bin-1.6 current
    [4] sun-jre-bin-1.6-plugin2
Desktop:Intel Pentium(R) Dual-Core CPU E5300 @ 2.60GHz,OS: Gentoo GNU/Linux
kingctx530
Posts: 121
Joined: Sun Feb 05, 2006 10:30 pm
Location: 地獄

Re: 有辦法更改Java程式的預設字型嗎?

Post by kingctx530 »

jojoyakira wrote:可以了,感謝kingctx530兄。< (_ _) >
這個方法真是太棒了。 :D
小弟這邊的情況是加入/opt/sun-jdk-1.6.0.17/jre/lib/fonts後,無效.....。 :101.gif:

Code: Select all

 $ cd /opt/sun-jdk-1.6.0.17/jre/lib/fonts
 $ sudo ln -sfn /usr/share/fonts/wqy-zenhei fallback
索性再加入/opt/sun-jre-bin-1.6.0.17/lib/fonts後,就成功了。 :D

Code: Select all

 $ cd /opt/sun-jre-bin-1.6.0.17/lib/fonts
 $ sudo ln -sfn /usr/share/fonts/wqy-zenhei fallback
最後,小弟研究了一下,發現問題應該出在eselect java-nsplugin上,以下是我的設置:
java-config:
  • $ java-config -f
    sun-jdk-1.6
  • $ java-config-2 -f
    sun-jdk-1.6
eselect:
  • $ eselect java-vm list
    Available Java Virtual Machines:
    [1] sun-jdk-1.6 system-vm user-vm
    [2] sun-jre-bin-1.6
  • $ eselect java-nsplugin list
    Available Java browser plugins
    [1] sun-jdk-1.6
    [2] sun-jdk-1.6-plugin2
    [3] sun-jre-bin-1.6 current
    [4] sun-jre-bin-1.6-plugin2

oh ~ oh ~ 也是啦,我一般只喜歡用一個版本,因為我有在用java 寫code 所以我都只留jdk的,其實只要設定的對,就不需要像以前這樣改字型 :102.gif:
我相信末來掌握在自己手上
Jackie
Posts: 137
Joined: Sat Jul 08, 2006 10:13 pm

Re: 有辦法更改Java程式的預設字型嗎?

Post by Jackie »

kingctx530 wrote:這個不是很容易找的到嗎...??
到sun-jdk-*/jre/lib/底下建立一個fallback的資料夾
再把你的字型檔link過來就能用了吧...我跑netbeans都是這樣.....不然就會口口 ,我一般都用wqy-zenhei的字型 :102.gif:
我不覺得很容易找啊XD
可能我的關鍵字太糟了
試過"java default font" "java 預設字型" ... 不知道為什麼沒看到這個方法
所以我昨天已經寫一個script來改fontconfig.properties了
嗯...好處就是這樣可以分開設定襯線字型、無襯線字型、等寬字型 ... (炸

不過不管是哪個方法都是每次裝新的jre/jdk升級就死掉了
所以只好用/etc/portage/bashrc裡面的post_src_install硬上

話說後來我發現icedtea的fontconfig.properties比較乾淨
至少是用人類看得懂的字型名稱 (如 DejaVu Sans)
而不是那種古早的方式 (如 -misc-baekmuk_gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1)

而且官方portage裡面也已經有版本被mark成stable了
試用一下感覺還不錯 看來要把sun jdk拿掉的日子不遠了 :D

附上兩段script

1. fix-java-fonts.pl: sun-jdk 用

Code: Select all

#!/usr/bin/perl
sub map_font
{
	my ($family, $style, $encoding) = split /\./, shift;
	if ($family eq "serif") { # 襯線
		return "dynalab-pmingliu"; #新細明體
	}
	elsif ($family eq "monospaced") { # 等寬
		return "dynalab-mingliu"; # 細明體
	}
	
	return "microsoft-microsoft jhenghei"; # 微軟正黑體 (預設)
}

while (<>) {
	s/^(.+)=-.+?-(medium|bold|demibold|italic)/"$1=-" . map_font($1) . "-$2"/ge;
	print;
}
使用方式:

Code: Select all

 $ perl -i fix-java-fonts.pl /opt/sun-jdk-1.6.0.17/jre/lib/fontconfig.properties
2. gen-icedtea-fontconfig.sh: icedtea用

Code: Select all

#!/bin/bash

# 襯線
serif="PMingLiU"
# 無襯線
sansserif="Microsoft JhengHei"
# 等寬
monospaced="MingLiU"
dialog="$sansserif"
dialoginput="$sansserif"

fontnames=("$serif" "$sansserif" "$monospaced")

echo "version=1"

for n in serif sansserif monospaced dialog dialoginput ; do
	for s in plain bold italic bolditalic ; do
		for c in latin-1 japanese-x0208 korean chinese-big5 chinese-gb18030 ; do
		echo "$n.$s.$c=${!n}"
		done
	done
done

cat <<_EOF_
sequence.allfonts=latin-1
sequence.allfonts.Big5=chinese-big5,latin-1
sequence.allfonts.x-euc-jp-linux=japanese-x0208,latin-1
sequence.allfonts.EUC-KR=korean,latin-1
sequence.allfonts.GB18030=chinese-gb18030,latin-1
sequence.fallback=chinese-big5,chinese-gb18030,japanese-x0208,korean
_EOF_

# 用fc-match程式產生字型檔路徑
for f in "${fontnames[@]}" ; do
	echo "filename.${f// /_}=`fc-match -v "$f" | sed -rn '/file:/{s/^.*"(.+)".*$/\1/g; p}'`"
done
使用方式:

Code: Select all

 $ bash gen-icedtea-fontconfig.sh >/opt/icedtea6-bin-1.6.2/jre/lib/fontconfig.properites
Last edited by Jackie on Fri Jan 08, 2010 9:05 am, edited 3 times in total.
kingctx530
Posts: 121
Joined: Sun Feb 05, 2006 10:30 pm
Location: 地獄

Re: 有辦法更改Java程式的預設字型嗎?

Post by kingctx530 »

Jackie wrote:
kingctx530 wrote:這個不是很容易找的到嗎...??
到sun-jdk-*/jre/lib/底下建立一個fallback的資料夾
再把你的字型檔link過來就能用了吧...我跑netbeans都是這樣.....不然就會口口 ,我一般都用wqy-zenhei的字型 :102.gif:
我不覺得很容易找啊XD
可能我的關鍵字太糟了
試過"java default font" "java 預設字型" ... 不知道為什麼沒看到這個方法
所以我昨天已經寫一個script來改fontconfig.properties了
嗯...好處就是這樣可以分開設定襯線字型、無襯線字型、等寬字型 ... (炸

不過不管是哪個方法都是每次裝新的jre/jdk升級就死掉了
所以只好用/etc/portage/bashrc裡面的post_src_install硬上

話說後來我發現icedtea的fontconfig.properties比較乾淨
至少是用人類看得懂的字型名稱 (如 DejaVu Sans)
而不是那種古早的方式 (如 -misc-baekmuk_gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1)

而且官方portage裡面也已經有版本被mark成stable了
試用一下感覺還不錯 看來要把sun jdk拿掉的日子不遠了 :D
嗯,那種古早的方式根本不是人看的 :106.gif:
反正能解決問題才重要 :102.gif:
我相信末來掌握在自己手上
jojoyakira
Posts: 284
Joined: Thu Mar 01, 2007 10:42 pm
Location: kaohsiung

Re: 有辦法更改Java程式的預設字型嗎?

Post by jojoyakira »

Jackie wrote: ....
附上兩段script

1. fix-java-fonts.pl: sun-jdk 用
.....
2. gen-icedtea-fontconfig.sh: icedtea用
.....
哇!好強大。
不知道是否能將這兩段scripts加到 gentoo-taiwan overlay?以後也比較好找,而且改 fontconfig.properties 是sun java的老問題了,幾乎每個安裝sun java的人都會遇到,如果有這兩段scripts那將會省下很多修改 fontconfig.properties 的時間。 :D
Desktop:Intel Pentium(R) Dual-Core CPU E5300 @ 2.60GHz,OS: Gentoo GNU/Linux
Jackie
Posts: 137
Joined: Sat Jul 08, 2006 10:13 pm

Re: 有辦法更改Java程式的預設字型嗎?

Post by Jackie »

jojoyakira wrote:哇!好強大。
不知道是否能將這兩段scripts加到 gentoo-taiwan overlay?以後也比較好找,而且改 fontconfig.properties 是sun java的老問題了,幾乎每個安裝sun java的人都會遇到,如果有這兩段scripts那將會省下很多修改 fontconfig.properties 的時間。 :D
我是覺得像這種字型設定
每個人的喜好不同
所以擺在overlay可能不恰當
跟設定相關的東西還是應該放在/etc ...XD
所以Java這個fontconfig.properties真是亂來...為什麼它不用fontconfig呢@@
我自己是把這段script寫在/etc/portage/bashrc裡面... 這樣以後更新jre也不用手動再改一次字型了

Code: Select all

post_src_install() {
	case "${CATEGORY}/${PN}" in
		dev-java/sun-jdk)
			local d="$D/opt/$P/jre/lib"
			perl -i fix-java-fonts.pl "$d/fontconfig.properties"
			rm -f "$d/fontconfig".{bfc,*.*}
		;;
		dev-java/icedtea6-bin)
			local d="$D/opt/$P/jre/lib"
			gen-icedtea-fontconfig.sh >"$d/fontconfig.properties"
			rm -f "$d/fontconfig".{bfc,*.*}
		;;
	easc
}
kingctx530
Posts: 121
Joined: Sun Feb 05, 2006 10:30 pm
Location: 地獄

Re: 有辦法更改Java程式的預設字型嗎?

Post by kingctx530 »

Jackie wrote:
jojoyakira wrote:哇!好強大。
不知道是否能將這兩段scripts加到 gentoo-taiwan overlay?以後也比較好找,而且改 fontconfig.properties 是sun java的老問題了,幾乎每個安裝sun java的人都會遇到,如果有這兩段scripts那將會省下很多修改 fontconfig.properties 的時間。 :D
我是覺得像這種字型設定
每個人的喜好不同
所以擺在overlay可能不恰當
跟設定相關的東西還是應該放在/etc ...XD
所以Java這個fontconfig.properties真是亂來...為什麼它不用fontconfig呢@@
我自己是把這段script寫在/etc/portage/bashrc裡面... 這樣以後更新jre也不用手動再改一次字型了

Code: Select all

post_src_install() {
	case "${CATEGORY}/${PN}" in
		dev-java/sun-jdk)
			local d="$D/opt/$P/jre/lib"
			perl -i fix-java-fonts.pl "$d/fontconfig.properties"
			rm -f "$d/fontconfig".{bfc,*.*}
		;;
		dev-java/icedtea6-bin)
			local d="$D/opt/$P/jre/lib"
			gen-icedtea-fontconfig.sh >"$d/fontconfig.properties"
			rm -f "$d/fontconfig".{bfc,*.*}
		;;
	easc
}
Java 字型問題己經超久了,一直沒有被好好修正過.......至少1.6後還能透過簡單的link就能處理,以前改過幾次....重灌的時候又沒留到設定檔真的會暈倒 :101.gif:
我相信末來掌握在自己手上
dnrmtn1121
Posts: 2
Joined: Tue Apr 06, 2010 3:41 pm

Re: 有辦法更改Java程式的預設字型嗎?

Post by dnrmtn1121 »

我用以下方式設定fireflysung.ttf 成為Java預設字型:
在/usr/share/fonts/turetype/arphic底下,ln -s fireflysung.ttf uming.ttf
fc-cache -f -v
jojoyakira
Posts: 284
Joined: Thu Mar 01, 2007 10:42 pm
Location: kaohsiung

Re: 有辦法更改Java程式的預設字型嗎?

Post by jojoyakira »

dnrmtn1121 wrote:我用以下方式設定fireflysung.ttf 成為Java預設字型:
在/usr/share/fonts/turetype/arphic底下,ln -s fireflysung.ttf uming.ttf
fc-cache -f -v
你使用的應該不是原來的 fontconfig.properties 吧!
小弟我查了一下 /opt/sun-jre-bin-1.6.0.19/lib/ 內的 fontconfig.properties ,並沒有 uming.ttf 的資料:

Code: Select all

 /opt/sun-jre-bin-1.6.0.19/lib $ grep uming fontconfig.properties
以下這幾個也沒有:

Code: Select all

 /opt/sun-jre-bin-1.6.0.19/lib $ grep uming fontconfig.properties.src 
 /opt/sun-jre-bin-1.6.0.19/lib $ grep uming fontconfig.Sun.properties.src
 /opt/sun-jre-bin-1.6.0.19/lib $ grep uming fontconfig.SuSE.properties.src 
 /opt/sun-jre-bin-1.6.0.19/lib $ grep uming fontconfig.RedHat.2.1.properties.src
 /opt/sun-jre-bin-1.6.0.19/lib $ grep uming fontconfig.RedHat.3.properties.src 
 /opt/sun-jre-bin-1.6.0.19/lib $ grep uming fontconfig.RedHat.4.properties.src
 /opt/sun-jre-bin-1.6.0.19/lib $ grep uming fontconfig.Turbo.properties.src
倒是 fontconfig.Ubuntu.properties.src 有 uming.ttc 字型的資料:

Code: Select all

 /opt/sun-jre-bin-1.6.0.19/lib $ grep uming fontconfig.Ubuntu.properties.src
allfonts.chinese-cn-iso10646=-arphic-ar pl uming cn-light-r-normal--*-%d-*-*-c-*-iso10646-1
allfonts.chinese-tw-iso10646=-arphic-ar pl uming tw-light-r-normal--*-%d-*-*-c-*-iso10646-1
allfonts.chinese-hk-iso10646=-arphic-ar pl uming hk-light-r-normal--*-%d-*-*-c-*-iso10646-1
filename.-arphic-ar_pl_uming_cn-light-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/truetype/arphic/uming.ttc
filename.-arphic-ar_pl_uming_tw-light-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/truetype/arphic/uming.ttc
filename.-arphic-ar_pl_uming_hk-light-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/truetype/arphic/uming.ttc
fontconfig.RedHat.properties.src 有一筆 uming.ttf 字型的資料:

Code: Select all

 /opt/sun-jre-bin-1.6.0.19/lib $ grep uming fontconfig.RedHat.properties.src
filename.-misc-ar_pl_shanheisun_uni-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/chinese/TrueType/uming.ttf
以下是 fontconfig.properties 中的 ttf、ttc 字型資料:

Code: Select all

 /opt/sun-jre-bin-1.6.0.19/lib $ grep ttf fontconfig.properties
filename.-arphic_technology_co.-ar_pl_mingti2l_big5-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/arphicfonts/bsmi00lp.ttf
filename.-misc-baekmuk_batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/baekmuk-fonts/batang.ttf
filename.-misc-baekmuk_gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/baekmuk-fonts/gulim.ttf
filename.-misc-kochi_gothic-medium-r-normal--*-%d-*-*-c-*-jisx0208.1983-0=/usr/share/fonts/kochi-substitute/kochi-gothic-subst.ttf
filename.-misc-kochi_mincho-medium-r-normal--*-%d-*-*-c-*-jisx0208.1983-0=/usr/share/fonts/kochi-substitute/kochi-mincho-subst.ttf
filename.-misc-ming for iso10646 -medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/hkscs-ming/min_uni.ttf
 /opt/sun-jre-bin-1.6.0.19/lib $ grep ttc fontconfig.properties
所以使用你提供的方法,還是要改 fontconfig.properties 。
Desktop:Intel Pentium(R) Dual-Core CPU E5300 @ 2.60GHz,OS: Gentoo GNU/Linux
Post Reply