jb中的光標(biāo)問(wèn)題
發(fā)表時(shí)間:2024-06-05 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]JBuilder中的光標(biāo)問(wèn)題由來(lái)已久,從JB4(我所用過(guò)的第一個(gè)JB版本,另:本文中JB乃JBuilder的縮寫)到最新的JBX,凡是代碼中有粗體或者斜體字的行,光標(biāo)總是出現(xiàn)在錯(cuò)誤的位置上,給編成帶來(lái)諸多不便,影響程序員的心情和效率。早期的解決辦法主要是修改JBuilder本身的代碼顯示方案,或者...
JBuilder中的光標(biāo)問(wèn)題由來(lái)已久,從JB4(我所用過(guò)的第一個(gè)JB版本,另:本文中JB乃JBuilder的縮寫)到最新的JBX,凡是代碼中有粗體或者斜體字的行,光標(biāo)總是出現(xiàn)在錯(cuò)誤的位置上,給編成帶來(lái)諸多不便,影響程序員的心情和效率。早期的解決辦法主要是修改JBuilder本身的代碼顯示方案,或者更改字體,或者將所有的粗體和斜體及粗斜體改為正常字體。雖然這些方法可以基本解決光標(biāo)位置不對(duì)的問(wèn)題,但都在一定程度上影響的視覺效果或者降低了JB的代碼語(yǔ)法標(biāo)亮功能,例如在JBX中子類如果覆蓋了的父類中定義的某個(gè)方法,那么在子類中該方法名是斜體的。后來(lái)隨著JB的發(fā)展普及,受此問(wèn)題影響的人越來(lái)越多,越來(lái)越讓人覺得不爽,因此有高手對(duì)此問(wèn)題追根溯源,原來(lái)問(wèn)題真正的根源在于JRE而非JB。在JRE中有些針對(duì)不同國(guó)家地區(qū)和語(yǔ)言而定義的字體屬性文件(<jre_dir>/lib/font.properties*),其中和我國(guó)有關(guān)的font.properties.zh文件的內(nèi)容有些不妥,從而導(dǎo)致了上述問(wèn)題。這同時(shí)也解釋了為什么其他國(guó)家及港臺(tái)地區(qū)的JB用戶幾乎沒有出現(xiàn)過(guò)此類問(wèn)題(除非她的操作系統(tǒng)中所在區(qū)域選在中國(guó)大陸)。但為什么只有JB出現(xiàn)了這類問(wèn)題,而其他運(yùn)行于JRE的Java程序沒有此類問(wèn)題呢?主要是其他程序很少用到粗體和斜體,另外和所用的字體也有關(guān)系,只有使用了font.properties.zh中所列的組合字體(Component Font)的粗體和斜體時(shí)才會(huì)出現(xiàn)光標(biāo)錯(cuò)位。網(wǎng)上之前出現(xiàn)過(guò)對(duì)這個(gè)文件的修改方案,例如添加NEED_CONVERTED和修改Exclusion Ranges,也不能從根本上解決該問(wèn)題。
由于只有中國(guó)大陸區(qū)域的用戶碰到此類問(wèn)題,因此其他區(qū)域?qū)?yīng)的font.properties*文件應(yīng)該沒有問(wèn)題。經(jīng)過(guò)和font.properties文件的對(duì)比,可以看出font.properties.zh中究竟哪里出了問(wèn)題——組合字體映射部分(Component Font Mappings)中對(duì)于每種字體的粗體和斜體,都映射到了常規(guī)字體,而沒有映射到相應(yīng)的粗體和斜體,由此導(dǎo)致了JB等應(yīng)用程序在對(duì)粗體或者斜體字符所占寬度計(jì)算時(shí),是按照常規(guī)字體的寬度進(jìn)行的,進(jìn)而導(dǎo)致了光標(biāo)的顯示位置和實(shí)際位置不符。如dialoginput.bold.0,對(duì)應(yīng)于字體為Courier New,粗體英文字母,正確的映射應(yīng)該是dialoginput.bold.0=Courier New Bold,ANSI_CHARSET,而在font.properties.zh中映射為dialoginput.bold.0=Courier New,ANSI_CHARSET(注:沒有bold)。
針對(duì)這種情況,可以對(duì)font.properties.zh進(jìn)行修改,將所有不正確的映射分別加上bold,Italic或者bold Italic。這樣JB和其他Java程序就不會(huì)有光標(biāo)錯(cuò)位的問(wèn)題了。
還應(yīng)注意的是,真正與中國(guó)大陸地區(qū)對(duì)應(yīng)的font.properties文件名應(yīng)為font.properties.zh_CN,由于JRE中默認(rèn)沒有這個(gè)文件,因此會(huì)使用范圍最接近的文件font.properties.zh。所以如果<jre_dir>/lib/下有font.properties.zh_CN,則應(yīng)優(yōu)先修改該文件。另外,font.properties.zh.98文件可能是Windows 9X系統(tǒng)中所使用的,因此如果操作系統(tǒng)為Windows 9X,應(yīng)修改該文件。
附修改后的font.properties.zh文件內(nèi)容:
# @(#)font.properties.zh1.10 02/03/07
#
# Copyright 2002 Sun Microsystems, Inc. All rights reserved.
# Modified by Yue Feng. 11/24/2003
# Component Font Mappings
#
dialog.plain.0=Arial,ANSI_CHARSET
dialog.plain.1=\u5b8b\u4f53,GB2312_CHARSET
dialog.plain.2=WingDings,SYMBOL_CHARSET
dialog.plain.3=Symbol,SYMBOL_CHARSET
dialog.bold.0=Arial Bold,ANSI_CHARSET
dialog.bold.1=\u5b8b\u4f53,GB2312_CHARSET
dialog.bold.2=WingDings,SYMBOL_CHARSET
dialog.bold.3=Symbol,SYMBOL_CHARSET
dialog.italic.0=Arial Italic,ANSI_CHARSET
dialog.italic.1=\u5b8b\u4f53,GB2312_CHARSET
dialog.italic.2=WingDings,SYMBOL_CHARSET
dialog.italic.3=Symbol,SYMBOL_CHARSET
dialog.bolditalic.0=Arial Bold Italic,ANSI_CHARSET
dialog.bolditalic.1=\u5b8b\u4f53,GB2312_CHARSET
dialog.bolditalic.2=WingDings,SYMBOL_CHARSET
dialog.bolditalic.3=Symbol,SYMBOL_CHARSET
dialoginput.0=Courier New,ANSI_CHARSET
dialoginput.1=\u5b8b\u4f53,GB2312_CHARSET
dialoginput.2=WingDings,SYMBOL_CHARSET
dialoginput.3=Symbol,SYMBOL_CHARSET
dialoginput.plain.0=Courier New,ANSI_CHARSET
dialoginput.plain.1=\u5b8b\u4f53,GB2312_CHARSET
dialoginput.plain.2=WingDings,SYMBOL_CHARSET
dialoginput.plain.3=Symbol,SYMBOL_CHARSET
dialoginput.bold.0=Courier New Bold,ANSI_CHARSET
dialoginput.bold.1=\u5b8b\u4f53,GB2312_CHARSET
dialoginput.bold.2=WingDings,SYMBOL_CHARSET
dialoginput.bold.3=Symbol,SYMBOL_CHARSET
dialoginput.italic.0=Courier New Italic,ANSI_CHARSET
dialoginput.italic.1=\u5b8b\u4f53,GB2312_CHARSET
dialoginput.italic.2=WingDings,SYMBOL_CHARSET
dialoginput.italic.3=Symbol,SYMBOL_CHARSET
dialoginput.bolditalic.0=Courier New Bold Italic,ANSI_CHARSET
dialoginput.bolditalic.1=\u5b8b\u4f53,GB2312_CHARSET
dialoginput.bolditalic.2=WingDings,SYMBOL_CHARSET
dialoginput.bolditalic.3=Symbol,SYMBOL_CHARSET
serif.plain.0=Times New Roman,ANSI_CHARSET
serif.plain.1=\u5b8b\u4f53,GB2312_CHARSET
serif.plain.2=WingDings,SYMBOL_CHARSET
serif.plain.3=Symbol,SYMBOL_CHARSET
serif.bold.0=Times New Roman Bold,ANSI_CHARSET
serif.bold.1=\u5b8b\u4f53,GB2312_CHARSET
serif.bold.2=WingDings,SYMBOL_CHARSET
serif.bold.3=Symbol,SYMBOL_CHARSET
serif.italic.0=Times New Roman Italic,ANSI_CHARSET
serif.italic.1=\u5b8b\u4f53,GB2312_CHARSET
serif.italic.2=WingDings,SYMBOL_CHARSET
serif.italic.3=Symbol,SYMBOL_CHARSET
serif.bolditalic.0=Times New Roman Bold Italic,ANSI_CHARSET
serif.bolditalic.1=\u5b8b\u4f53,GB2312_CHARSET
serif.bolditalic.2=WingDings,SYMBOL_CHARSET
serif.bolditalic.3=Symbol,SYMBOL_CHARSET
sansserif.plain.0=Arial,ANSI_CHARSET
sansserif.plain.1=\u5b8b\u4f53,GB2312_CHARSET
sansserif.plain.2=WingDings,SYMBOL_CHARSET
sansserif.plain.3=Symbol,SYMBOL_CHARSET
sansserif.bold.0=Arial Bold,ANSI_CHARSET
sansserif.bold.1=\u5b8b\u4f53,GB2312_CHARSET
sansserif.bold.2=WingDings,SYMBOL_CHARSET
sansserif.bold.3=Symbol,SYMBOL_CHARSET
sansserif.italic.0=Arial Italic,ANSI_CHARSET
sansserif.italic.1=\u5b8b\u4f53,GB2312_CHARSET
sansserif.italic.2=WingDings,SYMBOL_CHARSET
sansserif.italic.3=Symbol,SYMBOL_CHARSET
sansserif.bolditalic.0=Arial Bold Italic,ANSI_CHARSET
sansserif.bolditalic.1=\u5b8b\u4f53,GB2312_CHARSET
sansserif.bolditalic.2=WingDings,SYMBOL_CHARSET
sansserif.bolditalic.3=Symbol,SYMBOL_CHARSET
monospaced.0=Courier New,ANSI_CHARSET
monospaced.plain.1=\u5b8b\u4f53,GB2312_CHARSET
monospaced.plain.2=WingDings,SYMBOL_CHARSET
monospaced.plain.3=Symbol,SYMBOL_CHARSET
monospaced.bold.0=Courier New Bold,ANSI_CHARSET
monospaced.bold.1=\u5b8b\u4f53,GB2312_CHARSET
monospaced.bold.2=WingDings,SYMBOL_CHARSET
monospaced.bold.3=Symbol,SYMBOL_CHARSET
monospaced.italic.0=Courier New Italic,ANSI_CHARSET
monospaced.italic.1=\u5b8b\u4f53,GB2312_CHARSET
monospaced.italic.2=WingDings,SYMBOL_CHARSET
monospaced.italic.3=Symbol,SYMBOL_CHARSET
monospaced.bolditalic.0=Courier New Bold Italic,ANSI_CHARSET
monospaced.bolditalic.1=\u5b8b\u4f53,GB2312_CHARSET
monospaced.bolditalic.2=WingDings,SYMBOL_CHARSET
monospaced.bolditalic.3=Symbol,SYMBOL_CHARSET
# Font File Names
#
filename.\u5b8b\u4f53=SIMSUN.TTC
filename.Arial=ARIAL.TTF
filename.Arial_Bold=ARIALBD.TTF
filename.Arial_Italic=ARIALI.TTF
filename.Arial_Bold_Italic=ARIALBI.TTF
filename.Courier_New=COUR.TTF
filename.Courier_New_Bold=COURBD.TTF
filename.Courier_New_Italic=COURI.TTF
filename.Courier_New_Bold_Italic=COURBI.TTF
filename.Times_New_Roman=TIMES.TTF
filename.Times_New_Roman_Bold=TIMESBD.TTF
filename.Times_New_Roman_Italic=TIMESI.TTF
filename.Times_New_Roman_Bold_Italic=TIMESBI.TTF
filename.WingDings=WINGDING.TTF
filename.Symbol=SYMBOL.TTF
# Missing Glyph Character
#
default.char=2751
# Component Font Character Encodings
#
fontcharset.dialog.1=sun.io.CharToByteGBK
fontcharset.dialog.2=sun.awt.windows.CharToByteWingDings
fontcharset.dialog.3=sun.awt.CharToByteSymbol
fontcharset.dialoginput.1=sun.io.CharToByteGBK
fontcharset.dialoginput.2=sun.awt.windows.CharToByteWingDings
fontcharset.dialoginput.3=sun.awt.CharToByteSymbol
fontcharset.serif.1=sun.io.CharToByteGBK
fontcharset.serif.2=sun.awt.windows.CharToByteWingDings
fontcharset.serif.3=sun.awt.CharToByteSymbol
fontcharset.sansserif.1=sun.io.CharToByteGBK
fontcharset.sansserif.2=sun.awt.windows.CharToByteWingDings
fontcharset.sansserif.3=sun.awt.CharToByteSymbol
fontcharset.monospaced.0=sun.io.CharToByteGBK
fontcharset.monospaced.1=sun.io.CharToByteGBK
fontcharset.monospaced.2=sun.awt.windows.CharToByteWingDings
fontcharset.monospaced.3=sun.awt.CharToByteSymbol
# Exclusion Ranges
#
exclusion.dialog.0=0100-20ab,20ad-f8ff
exclusion.dialoginput.0=0100-20ab,20ad-f8ff
exclusion.serif.0=0100-20ab,20ad-f8ff
exclusion.sansserif.0=0100-20ab,20ad-f8ff
exclusion.monospaced.0=0100-20ab,20ad-f8ff
# Text Input Character Set
#
inputtextcharset=GB2312_CHARSET
需要說(shuō)明一點(diǎn),JB使用的是自己帶的JRE,而不是系統(tǒng)中的JRE,所以要修改JB安裝目錄下jdk目錄中jre/lib中的font.properties文件才有效。