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됩니다.
getGraphics()를 사용하지 마십시오! 컴퍼넌트가 아직 페인트되지 않았던 경우는 NULL를 돌려줍니다. 전화를 걸 때 UI 기본값이로드되지 않았을 수 있습니다. – MadProgrammer
@MadProgrammer 절대이 경우 또는 절대로? – sleeparrow
이것은 문맥에서 벗어나기 때문에 대답하기 어려운 질문입니다. 'getGraphics'는 컴포넌트를 렌더링하는 데 사용 된 마지막 그래픽 컨텍스트의 복사본을 제공합니다. 컴퍼넌트가 스크린에 렌더되지 않은 경우는, null가됩니다. 이 방법을 사용하거나 일반적으로 사용하는 것은 나쁜 습관입니다. 그래서 "결코"가혹하지는 않지만 일반적으로 피해야합니다. – MadProgrammer