3

Java で簿記プログラム用に作成している GUI の一部は、さまざまな文字列を表示する必要があります。この文字列を表示する前に、必要に応じて改行を追加する必要があります。これを行うために、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」の代わりに、いくつかの異なることを試しました。最初は、「new」を使用して FontMetrics オブジェクトを作成しようとしました...

fm = new FontMetrics();

...そのような方法で FontMetrics をインスタンス化できないことがわかります。getFontMetrics(font) を使用して FontMetrics オブジェクトを取得しようとしました。この質問の回答からデフォルトのスイング フォントを取得しました。

Swing JTabbedPane ラベルのデフォルトのフォントを取得するにはどうすればよいですか?

私のコードは次のようになりました:

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

これにより、NullPointerException がスローされました。私も試しました:

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

これにより、NullPointerExceptionも発生しました。おそらく、FontMetrics の使用方法を理解していません。どんな洞察も大歓迎です。

編集:さて、UIManager.getDefaults().getFont(...) を getFont() に置き換えて、上記の 2 つのスニペットをもう一度試してみました。同じ NullPointerException がスローされます。

4

1 に答える 1

0

問題が何であるかを判断するには、例外をスローしている物理行の各論理行を分離するようにしてください。例えば、

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

UIのデフォルトで「TabbedPane.font」キーに登録されているフォントがないことが問題だと思います。これを克服するには、メソッドを介してコンポーネントから直接フォントを取得できる必要がありますComponent#getFont。それはとにかくあなたが本当に欲しいフォントです。

于 2013-03-13T07:04:44.083 に答える