Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改JTextArea(非JTextPane)中的行距_Java_Swing_Fonts_Jtextarea_Css - Fatal编程技术网

Java 更改JTextArea(非JTextPane)中的行距

Java 更改JTextArea(非JTextPane)中的行距,java,swing,fonts,jtextarea,css,Java,Swing,Fonts,Jtextarea,Css,我试图找到一种方法来改变JTextArea组件中的行距 稍加搜索似乎总能找到相同的答案:“改用JTextPane,然后调用setParagraphAttributes” 但我想知道是否有可能仅仅通过一个JTextArea来实现这一点,例如,搞乱字体 使用deriveFont(…)方法,可以更改字体的跟踪和紧排,即字符之间的水平间距,但我无法找到更改垂直间距(可能是上升、下降、前导)的方法。我是不是遗漏了什么 轻量级编码有什么问题 没有什么,您应该使用最简单的组件来完成此任务。但是,如果简单组件不

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

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

但我想知道是否有可能仅仅通过一个JTextArea来实现这一点,例如,搞乱字体

使用
deriveFont(…)
方法,可以更改字体的跟踪和紧排,即字符之间的水平间距,但我无法找到更改垂直间距(可能是上升、下降、前导)的方法。我是不是遗漏了什么

轻量级编码有什么问题

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

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

Swing text组件使用
视图
绘制文本。视图负责设置文本的格式和位置。因此,每个视图确定何时换行以及下一行的位置

对于JTextArea,它使用平面视图或WrappedPlanView。对于平面视图,绘制代码为:

drawLine(line, g, x, y);
y += fontHeight;
其中,fontHeight是通过使用FontMetrics.getHeight()方法确定的


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

正如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
的方法,或者可能是传递到jtext区域的相关
FontRenderContext
来修改行高。例如,是否有某种方法可以影响font报告的上升、下降和前导值?奇怪的是,你几乎可以改变字体外观的任何其他方面,除了这个…

你需要1。将所有方法从JTextPane添加到您自己的JTextArea,2。要使用Html,还需要另一个技巧来强制在JTextArea中正确呈现Html
,稍微搜索一下似乎总能找到相同的答案:
-那么JTextPane有什么问题?你为什么要为JTextArea重新设计轮子?:)我期待这些评论。。。有时候,我只是对学习新东西和找出可能的东西感兴趣。这个
deriveFont(…)
函数有10亿个选项,包括应用基于矩阵的几何变换等。我只是想知道是否有可能用它来做一些魔术。它的文档记录很差,所以一些用例示例会很好。顺便说一句:轻量级编码有什么问题?如果一个简单的JTextArea可以做到这一点,为什么要转到一个完整的富文本JTextPane?没有其他想法,任何人??;)对的这就是为什么我希望找到一种方法来处理JTextArea而不是文本区域的字体。我找到了一种方法(见我的答案),但也许可以做得更好。顺便说一句:这个小冒险教会了我很多关于挥杆的知识。我对Swing有点陌生,不知道它在引擎盖下有多复杂。有时候打开潘多拉魔盒,潜入所有的弹簧和齿轮,让一切运转起来,这会很有趣。即使我真的不应该/不需要弄乱任何一个概念,我仍然喜欢学习这些概念(在这里:组件、UI、RenderContext、视图、度量等等)。关于如何构造代码和优雅地解决某些问题,通常会有一些聪明的想法,尽管在这种情况下,看起来有点混乱……;)