FontMetrics генерирует исключение NullPointerException
Часть графического интерфейса, которую я создаю для бухгалтерской программы на Java, должна отображать различную строку. Перед отображением этой строки необходимо добавить разрывы строк, если это необходимо. Для этого я создал класс, который расширяет JTextArea, и переопределил метод setText() как таковой:
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");
}
}
Вместо "// Instatiate FontMetrics" я пробовал несколько разных вещей. Сначала я попытался создать объект FontMetrics, используя "new"...
fm = new FontMetrics();
... только чтобы обнаружить, что вы не можете создать экземпляр FontMetrics таким способом. Я попытался получить объект FontMetrics с помощью getFontMetrics(font), получив стандартный свинг-шрифт из ответа на этот вопрос:
Как получить шрифт по умолчанию для меток Swing JTabbedPane?
Мой код выглядел так:
fm = getFontMetrics(UIManager.getDefaults().getFont("TabbedPane.font"));
Это бросило исключение NullPointerException. Я также попробовал:
fm = getGraphics().getFontMetrics(UIManager.getDefaults().getFont("TabbedPane.font"));
Это также дало мне исключение NullPointerException. Возможно, я не понимаю, как использовать FontMetrics. Любое понимание высоко ценится.
Изменить: Хорошо, теперь я дополнительно попробовал два вышеупомянутых фрагмента снова, заменив UIManager.getDefaults(). GetFont(...) на getFont(). Выдается то же исключение NullPointerException.
1 ответ
Чтобы определить, в чем заключается проблема, вы должны попытаться выделить каждую из логических строк в физической строке, которая вызывает исключение. Например,
UIDefaults uiDefaults = UIManager.getDefaults();
Font font = uiDefaults.getFont("TabbedPane.font");
Graphics graphics = getGraphics();
fm = graphics.getFontMetrics(font);
Я подозреваю, что проблема заключается в том, что в значениях по умолчанию пользовательского интерфейса нет шрифта, зарегистрированного с помощью клавиши "TabbedPane.font". Чтобы преодолеть это, вы должны быть в состоянии получить шрифт непосредственно из вашего компонента через Component#getFont
метод. Это действительно шрифт, который вы хотите в любом случае.