문제

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)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top