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

Mar*_* A. 2 css java fonts swing jtextarea

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

一点点搜索似乎总是会揭示相同的答案:“改用 JTextPane,然后调用 setParagraphAttributes”。

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

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

Mar*_* A. 6

正如 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的来修改行高。例如,是否有某种方法可以影响字体报告的上升、下降和前导值?除了这个之外,您几乎可以更改字体外观的任何其他方面,这似乎很奇怪......