Java 更改JTextArea(非JTextPane)中的行距
我试图找到一种方法来改变JTextArea组件中的行距 稍加搜索似乎总能找到相同的答案:“改用JTextPane,然后调用setParagraphAttributes” 但我想知道是否有可能仅仅通过一个JTextArea来实现这一点,例如,搞乱字体 使用Java 更改JTextArea(非JTextPane)中的行距,java,swing,fonts,jtextarea,css,Java,Swing,Fonts,Jtextarea,Css,我试图找到一种方法来改变JTextArea组件中的行距 稍加搜索似乎总能找到相同的答案:“改用JTextPane,然后调用setParagraphAttributes” 但我想知道是否有可能仅仅通过一个JTextArea来实现这一点,例如,搞乱字体 使用deriveFont(…)方法,可以更改字体的跟踪和紧排,即字符之间的水平间距,但我无法找到更改垂直间距(可能是上升、下降、前导)的方法。我是不是遗漏了什么 轻量级编码有什么问题 没有什么,您应该使用最简单的组件来完成此任务。但是,如果简单组件不
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、视图、度量等等)。关于如何构造代码和优雅地解决某些问题,通常会有一些聪明的想法,尽管在这种情况下,看起来有点混乱……;)