SWT -OS Monosccaced 글꼴을 얻는 방법
문제
SWT에는 다양한 운영 체제에서 작동하는 단순한 글꼴을 얻을 수있는 방법이 있습니까?
예를 들어. 이것은 Linux에서 작동하지만 Windows는 아닙니다.
Font mono = new Font(parent.getDisplay(), "Mono", 10, SWT.NONE);
아니면 무효가되지 않을 때까지 다양한 글꼴 (Consolas, Terminal, Monaco, Mono)을로드하는 방법이 필요합니까? 또는 시작시 속성 파일로 지정할 수 있습니다.
나는 디스플레이에서 시스템 글꼴을 가져 오려고 시도했지만 단일 화 된 것은 아니었다.
해결책
섹션에 따르면 글꼴 구성 파일 JDK 문서에서 국제화 지원-관련 API, 개념 논리 글꼴s는 기본 글꼴 구성 파일의 물리적 글꼴에 매핑되는 특정 플랫폼 독립 글꼴을 정의하는 데 사용됩니다.
Java 플랫폼은 Serif, Sansserif, Monospaced, Dialog 및 DialogInput 등 모든 구현이 지원 해야하는 5 가지 논리 글꼴 이름을 정의합니다. 이 논리 글꼴 이름은 구현 의존적 방식으로 물리적 글꼴에 매핑됩니다.
그래서 당신의 경우, 나는 시도 할 것이다
Font mono = new Font(parent.getDisplay(), "Monospaced", 10, SWT.NONE);
현재 플랫폼의 물리적 모노 스케이스 글꼴을 처리하려면 코드가 실행 중입니다.
편집하다: SWT는 논리적 글꼴에 대해 아무것도 모르는 것 같습니다 (버그 48055 eclipse.org에서 이것을 자세히 설명합니다). 이 버그 보고서에서 Hackish 해결 방법이 제안되었으며, 여기서 물리적 글꼴의 이름이 AWT 글꼴에서 검색 될 수 있습니다 ...
다른 팁
나는 일식이 텍스트 필드, 콘솔 등에 사용하기 위해 몬 스페이스 글꼴에 접근 할 수 있어야한다는 것을 깨달을 때까지 이것에 대해 내 머리를 강타하는 데 잠시 시간을 보냈다.
Font terminalFont = JFaceResources.getFont(JFaceResources.TEXT_FONT);
당신이 관심있는 모든 것이 몽 스페이스 글꼴을 잡는 것입니다.
편집하다: 또는 @ctron의 의견에 따라 :
Font font = JFaceResources.getTextFont();
편집하다: 경고 ( @lii의 주석 기반) : 이렇게하면 구성된 텍스트 글꼴이 제공되며, 이는 사용자가 재정의 할 수 있으며 모국어 글꼴이 아닐 수 있습니다. 그러나 예를 들어 편집기 및 콘솔에 사용되는 글꼴과 일치합니다. 아마 당신이 원하는 것.
내가 아는 한, AWT API는 기본 글꼴 정보를 노출시키지 않습니다. 당신이 그것에 도달 할 수 있다면, 나는 그것이 구현 의존적 일 것으로 기대할 것이다. 확실히, 글꼴 매핑 파일을 몇 개의 JRE LIB 디렉토리로 비교하면 일관된 방식으로 정의되지 않음을 알 수 있습니다.
자신의 글꼴을로드 할 수는 있지만 플랫폼이 필요한 것을 제공한다는 것을 알면 약간 낭비되는 것 같습니다.
이것은 JRE 글꼴을로드하는 핵입니다.
private static Font loadMonospacedFont(Display display) {
String jreHome = System.getProperty("java.home");
File file = new File(jreHome, "/lib/fonts/LucidaTypewriterRegular.ttf");
if (!file.exists()) {
throw new IllegalStateException(file.toString());
}
if (!display.loadFont(file.toString())) {
throw new IllegalStateException(file.toString());
}
final Font font = new Font(display, "Lucida Sans Typewriter", 10,
SWT.NORMAL);
display.addListener(SWT.Dispose, new Listener() {
public void handleEvent(Event event) {
font.dispose();
}
});
return font;
}
IBM/WIN32/JRE1.4, SUN/WIN32/JRE1.6, SUN/LINUX/JRE1.6에서 작동하지만 매우 취약한 접근 방식입니다. i18N에 대한 귀하의 요구에 따라, 거기에서도 문제가 될 수 있습니다 (확인하지 않았습니다).
또 다른 해킹은 플랫폼에서 사용 가능한 글꼴을 테스트하는 것입니다.
public class Monotest {
private static boolean isMonospace(GC gc) {
final String wide = "wgh8";
final String narrow = "1l;.";
assert wide.length() == narrow.length();
return gc.textExtent(wide).x == gc.textExtent(narrow).x;
}
private static void testFont(Display display, Font font) {
Image image = new Image(display, 100, 100);
try {
GC gc = new GC(image);
try {
gc.setFont(font);
System.out.println(isMonospace(gc) + "\t"
+ font.getFontData()[0].getName());
} finally {
gc.dispose();
}
} finally {
image.dispose();
}
}
private static void walkFonts(Display display) {
final boolean scalable = true;
for (FontData fontData : display.getFontList(null, scalable)) {
Font font = new Font(display, fontData);
try {
testFont(display, font);
} finally {
font.dispose();
}
}
}
public static void main(String[] args) {
Display display = new Display();
try {
walkFonts(display);
} finally {
display.dispose();
}
}
}
이것은 아마도 로케일 문제에 노출 될 수 있기 때문에 아마도 좋은 접근법이 아닙니다. 게다가, 당신은 당신이 만나는 첫 번째 모노 스케이스 글꼴이 일부 와인딩 아이콘 세트가 아닌지 모르겠습니다.
가장 좋은 방법은 글꼴/로케일 매핑 화이트리스트를 기반으로 최상의 추측을 취하고 사용자가 UI를 쉽게 재구성 할 수 있는지 확인하는 것입니다. fontdialog.
동일한 문제가있는 사람들의 경우 글꼴 TTF 파일을 다운로드하여 리소스 폴더에 넣을 수 있습니다 (My Case /Font /**.ttf) 그리고이 메드를 애플리케이션에 추가하십시오. 100 %일합니다.
public Font loadDigitalFont(int policeSize) {
URL fontFile = YouClassName.class
.getResource("/fonts/DS-DIGI.TTF");
boolean isLoaded = Display.getCurrent().loadFont(fontFile.getPath());
if (isLoaded) {
FontData[] fd = Display.getCurrent().getFontList(null, true);
FontData fontdata = null;
for (int i = 0; i < fd.length; i++) {
if (fd[i].getName().equals("DS-Digital")) {
fontdata = fd[i];
break;
}}
if (fontdata != null) {
fontdata.setHeight(policeSize);
fontdata.setStyle(SWT.BOLD);return new Font(getDisplay(), fontdata));}
}return null; }
단일 글꼴 만 사용하려면 "택배"=> new Font(display, "Courier", 10, SWT.NORMAL)