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



我正试图找到一种方法来更改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是有序的。。。

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

轻量级编码有什么问题?

没什么,你应该使用最简单的组件来完成任务。但是,如果简单组件不支持某个需求,通常是因为需求更复杂,您需要一个更复杂的组件来实现功能。在设置一个类的属性时,它很少会如此简单。

有时我只是对学习新东西和找出可能的东西感兴趣。

摆动文本组件使用View来绘制文本。视图有责任格式化和定位文本。因此,每个视图都决定何时换行以及下一行的位置。

在JTextArea的情况下,它使用Plainview或WrappedPlanView。对于Plainview,涂装代码为:

drawLine(line, g, x, y);
y += fontHeight;

其中fontHeight是通过使用FontMetrics.getHeight()方法确定的。

因此,该值基本上是在View中硬编码的。您可以始终为文本区域提供自定义视图,但覆盖视图通常不是一项容易的任务。

最新更新