gpt4 book ai didi

java - 更改 JTextArea(不是 JTextPane)中的行距

转载 作者:行者123 更新时间:2023-11-29 07:55:50 24 4
gpt4 key购买 nike

我试图找到一种方法来更改 JTextArea 组件中的行距。

稍微搜索一下似乎总能找到相同的答案:“改用 JTextPane,然后调用 setParagraphAttributes”。

但我想知道是否有可能只用一个 JTextArea 来实现这一点,例如,弄乱字体。

使用 deriveFont(...) 方法,可以更改字体的跟踪和字距调整,即字符之间的水平间距,但我一直没能找到更改垂直间距的方法(可能是上升、下降、前导)。我错过了什么吗?

最佳答案

正如 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(...) 被经常调用,并且在给定的示例中,每次都会创建包装类的新实例。因此,至少,为每个给定字体缓存创建的 FontMetricsWrapper 的 HashMap 是有序的......

但是,我真正希望的是一种使用 Font 或关联的 FontRenderContext 传递到 JTextArea 以修改行高的方法。例如,是否有某种方法可以影响字体报告的上升、下降和主值?看起来很奇怪,你几乎可以改变字体外观的任何其他方面,除了这个......

关于java - 更改 JTextArea(不是 JTextPane)中的行距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17762642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com