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 がスローされます。