当前位置: 首页 > 知识库问答 >
问题:

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

凤修筠
2023-03-14

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

稍微搜索一下似乎总是会发现相同的答案:“改用 JTextPane,然后调用 setParagraphAttributes”。

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

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

共有2个答案

符鸣
2023-03-14

轻量级编码有什么问题?

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

有时候,我只是对学习新的东西感兴趣,想知道什么是可能的。

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

在JText领域的情况下,它使用Plainview或WrapedPlanView。对于Plainview,绘画代码是:

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

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

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

海雪松
2023-03-14

正如camicker所指出的,<code>JTextArea</code>不提供直接更改线条高度的方法。它只使用相应的<code>FontMetrics</code>提供的字体高度。

但是,这会使用以下辅助类打开攻击点:

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, ...);
    // }

}

然后,可以像这样创建JText领域:

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
            }
        };
    }
};

这绝对不是最干净的解决方案,只是作为概念证明。例如,一个问题是getFontMetric(…)经常被调用,并且在给定的示例中,每次都会创建包装类的新实例。因此,至少,为每个给定字体缓存创建的FontMetricsWrapper的HashMap将是有序的…

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

 类似资料:
  • 问题内容: 我想将不同的字体行添加到JTextArea,但是最后一种字体似乎会覆盖其他字体。 请帮忙… 问题答案: 尝试使用JEditorPane / JTextPane http://download.oracle.com/javase/tutorial/uiswing/components/editorpane.html 这些支持HTML格式。普通的JTextArea的setFont方法将为整

  • 问题内容: 我目前正在使用Swing中的控制台窗口。它基于JTextArea并像普通命令行一样工作。在一行中键入命令,然后按Enter。在下一行中,显示输出,在该输出下,您可以编写下一条命令。 现在,我想只能用命令编辑当前行。上面的所有行(旧命令和结果)均不可编辑。我怎样才能做到这一点? 问题答案: 您不需要创建自己的组件。 这可以使用自定义DocumentFilter来完成(就像我已经完成的那样

  • 我在一个非常简单的GUI中有一个JTextPane,我将它用作学习Java的游戏的输出控制台,我(尝试)将它与Windows类中的append方法一起使用,从另一个类(程序本身)或从command reader类调用它。理论上,它应该输出我输入的命令,在下几行中,它的输出来自所述程序。 另外,这里有一些示例输出 在调试过程中,我看到为Swing/AWT创建了一个线程,但我根本不了解线程,所以我只希

  • 我正在使用JTextPane创建一个文本编辑器,它允许用户更改所选文本的颜色。但是当用户选择文本时,然后选择更改颜色的选项(比如,改为红色),直到取消选择文本时,文本才会显示为红色。我尝试使用setSelectedTextColor来更改所选文本的颜色,但这不起作用,因为当之后选择文本时,它会将文本更改为红色。有没有一种方法可以使选定的文本显示为它的实际颜色?或者像它在Word中的工作方式那样,它

  • 问题内容: 我一直在尝试为我的文本更改事件处理机制。就我的目的而言,只要。的文本发生更改,就必须触发一个事件。我尝试使用该接口,这是我的代码。 当文本区域的文本与硬编码的文本匹配时,什么也没发生。如何为此更改事件。 可以通过实现目标吗?如果可以,那怎么办? 问题答案: 我将通过(实际上是一个PlainDocument)获得JTextArea的文档,并使用DocumentListener来侦听更改。