2013-03-13 2 views
3

Java에서 부기 프로그램 용으로 만드는 GUI의 일부가 다양한 String을 표시해야합니다. 이 문자열을 표시하기 전에 적절한 경우 줄 바꿈을 추가해야합니다. 이를 위해, 나는 JTextArea에를 확장하는 클래스를 생성하고 다음과 같은의 setText() 메소드를 오버라이드 (override) 한 : "// 인스턴스화 할 폰트 메트릭스"대신에FontMetrics가 NullPointerException을 생성합니다.

public class ContentPane extends JTextArea { 

private FontMetrics fm; 

public ContentPane() { 
    super(); 
    // Instatiate FontMetrics 
} 

public ContentPane(String string) { 
    super(string); 
    // Instatiate FontMetrics 
} 

@Override 
public void setText(String text) { 
    int n; 
    String remainder; 

    while (fm.stringWidth(text) > maxStringWidth()) { 
     n = numberOfCharsToCut(text); 
     remainder = text.substring(text.length() - n); 
     text = text.substring(0, text.length() - n) + "\n" + remainder; 
    } 

    super.setText(text); 
} 

private int numberOfCharsToCut(String str) { 
    String newStr = str; 
    int i = 0; 
    while (fm.stringWidth(newStr) > maxStringWidth()) { 
     newStr = str.substring(0, str.length() - i); 
     i++; 
    } 
    return i; 
} 

private int maxStringWidth() { 
    return fm.stringWidth("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@lll"); 
} 
} 

, 나는 몇 가지 다른 일을 시도했습니다. 처음에 난 단지 당신이 그런 방법으로 폰트 메트릭스를 인스턴스화 할 수 없습니다 찾을 ...

fm = new FontMetrics(); 

... "새"를 사용하여 폰트 메트릭스 개체를 만들려고.

How do I get the default font for Swing JTabbedPane labels?

내 코드는 다음과 같이 보았다 : 나는이 질문에 대한 답변에서 기본 스윙 글꼴을 받고, getFontMetrics에게 (글꼴)를 사용하여 폰트 메트릭스 객체를 검색하는 노력이 NullPointerException이 던져

fm = getFontMetrics(UIManager.getDefaults().getFont("TabbedPane.font")); 

. 나는 또한 시도했다 :

fm = getGraphics().getFontMetrics(UIManager.getDefaults().getFont("TabbedPane.font")); 

이것은 나에게 NullPointerException을 또한 주었다. 아마도 FontMetrics를 사용하는 방법을 모르겠다. 모든 통찰력은 높이 평가됩니다.

편집 : 좋아, 이제 위의 두 조각을 다시 시도해 보았습니다. UIManager.getDefaults(). getFont (...)를 getFont()로 대체했습니다. 같은 NullPointerException가 Throw됩니다.

+0

getGraphics()를 사용하지 마십시오! 컴퍼넌트가 아직 페인트되지 않았던 경우는 NULL를 돌려줍니다. 전화를 걸 때 UI 기본값이로드되지 않았을 수 있습니다. – MadProgrammer

+0

@MadProgrammer 절대이 경우 또는 절대로? – sleeparrow

+0

이것은 문맥에서 벗어나기 때문에 대답하기 어려운 질문입니다. 'getGraphics'는 컴포넌트를 렌더링하는 데 사용 된 마지막 그래픽 컨텍스트의 복사본을 제공합니다. 컴퍼넌트가 스크린에 렌더되지 않은 경우는, null가됩니다. 이 방법을 사용하거나 일반적으로 사용하는 것은 나쁜 습관입니다. 그래서 "결코"가혹하지는 않지만 일반적으로 피해야합니다. – MadProgrammer

답변

0

문제점을 확인하려면 실제 행에서 예외를 발생시키는 각 논리 행을 분리해야합니다. 예를 들어,

UIDefaults uiDefaults = UIManager.getDefaults(); 
Font font = uiDefaults.getFont("TabbedPane.font"); 
Graphics graphics = getGraphics(); 
fm = graphics.getFontMetrics(font); 

나는 문제가 UI 기본값에서 "TabbedPane.font"키에 등록 된 글꼴이없는 있다는 것을 의심한다. 이를 극복하려면 Component#getFont 메서드를 통해 구성 요소에서 직접 글꼴을 가져올 수 있어야합니다. 그것은 어쨌든 당신이 원하는 폰트입니다.