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 метод. Это действительно шрифт, который вы хотите в любом случае.

Другие вопросы по тегам