camickr が指摘しJTextArea
たように、行の高さを直接変更する方法はありません。対応する によって提供されるフォントの高さを使用するだけですFontMetrics
。
ただし、これにより、次のヘルパー クラスを使用した攻撃の可能性が残されます。
public class FontMetricsWrapper extends FontMetrics {
private final FontMetrics target;
public FontMetricsWrapper(FontMetrics target) {
super(target.getFont());
this.target = target;
}
@Override
public int bytesWidth(byte[] data, int off, int len) {
return target.bytesWidth(data, off, len);
}
@Override
public int charWidth(char ch) {
return target.charWidth(ch);
}
@Override
public int charWidth(int codePoint) {
return target.charWidth(codePoint);
}
// ... tons more @Override's, all of the same form:
//
// @Override
// public baz foo(bar, ...) {
// return target.foo(bar, ...);
// }
}
次に、次のように JTextArea を作成することが可能になります。
JTextArea myTextArea = new JTextArea("Some text") {
@Override
public FontMetrics getFontMetrics(Font font) {
return new FontMetricsWrapper(super.getFontMetrics(font)) {
@Override
public int getHeight() {
return 10; // Gives line height in pixels
}
};
}
};
これは間違いなく最もクリーンなソリューションではなく、単に概念実証を目的としています。たとえば、getFontMetrics(...)
非常に頻繁に呼び出される問題の 1 つは、この例では毎回ラッパー クラスの新しいインスタンスを作成することです。したがって、少なくとも、FontMetricsWrapper
特定のフォントごとに作成されたものをキャッシュする HashMap が適切です...
しかし、私が本当に望んでいたのは、行の高さを変更するために JTextArea に渡された、Font
または関連するを操作する方法でした。FontRenderContext
たとえば、報告されたフォントのアセント、ディセント、リーディング値に影響を与える方法はありますか? これを除いて、フォントの外観の他のほとんどの側面を変更できるのは奇妙に思えます...