正如 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, ...);
// }
}
Run Code Online (Sandbox Code Playgroud)
然后,可以像这样创建 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
}
};
}
};
Run Code Online (Sandbox Code Playgroud)
这绝对不是最干净的解决方案,只是作为概念证明。例如,一个问题是getFontMetrics(...)经常调用,并且在给定的示例中,每次都会创建包装类的一个新实例。因此,至少,缓存FontMetricsWrapper为每个给定字体创建的 HashMap将是有序的......
但是,我真正希望的是一种方法来处理传递给 JTextArea的Font或关联FontRenderContext的来修改行高。例如,是否有某种方法可以影响字体报告的上升、下降和前导值?除了这个之外,您几乎可以更改字体外观的任何其他方面,这似乎很奇怪......
| 归档时间: |
|
| 查看次数: |
4509 次 |
| 最近记录: |