2013-07-05 1 views
1

는 내가 가진 : 다음 그러나 나는 어떤 글꼴을 전혀 렌더링, 또는 끔찍 넘어 보이지 않는 것을 찾는거야 사용자 정의 렌더러하는 JComboBox에 렌더링 할자바 - 어떤 글꼴이 렌더링되지 않는지 어떻게 알 수 있습니까?

Font[] fonts = 
    java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); 

. 일부는 JComboBox에서 높이 100-200 픽셀을 사용합니다. 일부 익숙하지 않은 글꼴도 있습니다. 따라서 예를 들어 네 번째 항목은 읽을 수 없으며 다섯 번째 항목 (파란색으로 선택된 항목)은 거대하며 아래로 스크롤해도 문자가 표시되지 않습니다.

enter image description here

나는 잘못된 글꼴을 제거하려고 보았다하지만 난 좋지 않은 화이트리스트 것보다 다른 할 수있는 방법을 찾을 수 없습니다.

하지만 두 번째는 전체 정말 얼마나 특정 문자를 확인하는 방법이 아니라 끔찍한 렌더링 : 내가 찾은

가장 좋은 기사입니다.

나는 또한 getAvailableFontFamilyNames()을 시도했지만 목록이 줄어들지 만 JComboBox에 심하게 렌더링 된 여러 글꼴이 계속 표시됩니다. 나쁘게 렌더링함으로써 나는 높이의 톤과 함께 보이지 않는 것을 의미합니다. 따라서 canDisplay('a') 또는 그와 비슷한 것을 시도해도 여전히 true를 반환하기 때문에 작동하지 않습니다.

+0

* "나는 높이의 톤으로는 보이지 않는다"는 것을 의미합니다. * 그림은 천 단어를 그립니다. 또한 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+0

스크린 샷을 추가했습니다. 이 코드는 JLabel.setFont (fonts [x] .deriveFont (14f))의 글꼴을 통과하는 루프입니다. 그래서 특별한 것은 없습니다 –

답변

2

"끔찍한 생각"에 대한 통계는 없지만 원하는 문자열을 화면에 표시되지 않는 버퍼에 그릴 수 있고 각 글꼴 아래에 "점유"문자열이있는 사각형 크기를 볼 수 있습니다.

here을 참조하십시오.

이렇게하면 모든 글꼴로 동일한 문자열을 렌더링 할 수 있고 너무 작거나 너무 큰 "사각형"을 생성하는 글꼴을 꺼내 버릴 수 있습니다. 즉 현재 UI를 엉망으로 만드는 모든 글꼴을 제거해야합니다.

+0

그게 제가 생각해 낸 해결책입니다. 그것은 대부분 이상적 일지라도 정확하게 이상적인 것은 아닙니다. 더 나은 단어가 부족하여 더 적절한 해결책을 찾기를 바랬습니다. –

+0

@StephaneGrenier - 한 번 글꼴이 문자열의 모든 문자를 렌더링 할 수 있다고 선언하면 시도하지 않고 어떻게 실격시킬 수 있습니까?:-) – radai

+0

그래서 나는 왜 묻고있다;) 나는 좋은 해결책이 없다. 유능한 것의 정의가 꽤 느슨한 것 같습니다. 나는 크기 검사로 복귀하고 canDisplay를 기본 글꼴로 사용한다. 이상적은 아니지만 다른 방법은 보이지 않습니다. ( –

0

내가 사용 결국 해결책은 radai 무슨 짓을 통합뿐만 아니라 내가 함께 결국 너무 canDisplay('a')을 추가 렌더링 된 글꼴의 크기를 확인

private boolean isAcceptableFont(Font font) 
{ 
    int fontHeight = getFontMetrics(font).getHeight(); 
    if(fontHeight > MAX_FONT_HEIGHT || fontHeight < MIN_FONT_HEIGHT) 
     return false; 

    if(getFontMetrics(font).stringWidth(TEST_STRING_FOR_FONT_WIDTH) <= MIN_FONT_WIDTH) 
     return false; 

    if(!font.canDisplay('a')) 
     return false; 

    return true; 
} 

나쁜 글꼴을 많이 제거하지만, 여전히 있었다 정말 좋지 않게 렌더링 된 몇 가지. 최소한 문자 'a'를 표시 할 수 있는지 확인하기 위해 나머지 불량 글꼴을 필터링 한 것으로 보입니다.

이상적은 아니지만 99 가지 이상의 의미가없는 글꼴을 필터링했습니다.

관련 문제