-3

我想创建一个 JTextArea,它看起来像 JTextArea,行为像 JTextArea,响应像 JTextArea,说话像 JTextArea,移动像 JTextArea 等,但不是 JTextArea。

简而言之,我想创建一个 100% 基于 JTextArea 的自定义摆动组件。一旦我这样做了,我将能够更改 JTextArea 的其他硬编码属性并制作我自己的自定义 JTextArea。没有按我需要的方式设计的预定义摆动组件,但 JTextArea 是最接近的,这就是我选择它的原因。

我想更改 JTextArea 行之间的间距。不,我不想使用 JtextPane,我已经尝试过了,它不适用于我的程序,它计算它的位置不同,看起来也不同,并且应用 JtextArea 边框只会让事情变得更糟。

我不是在尝试扩展 JTextArea,而是在尝试创建一个自定义 JTextArea,就像在自定义 swing 组件中一样,使用更改的硬编码属性,这些属性通过 JTextAreas 方法无法配置。

但是,我不知道该怎么做。我一直在互联网上查找它,但只有一个关于从 strath 构建自己的组件的广泛指南......

弄清楚这将花费很多时间,并且不会真正解决我的问题。

我唯一要做的就是创建一个类(或几个类),其中包含构建 JTextArea 的所有内容。从 JTextComponent 级别开始,复制所有用于创建 JTextArea 的较低级别的类。我还想指出,我使用 Nibus 的外观和感觉,我认为可能需要包含一些类才能使自定义 JTextArea 在该 LAF 下正常运行。

我查看了 swing 的源代码,里面充满了一切。考虑到我对核心挥杆结构和机制一无所知,弄清楚在创建 JTextArea 时使用了哪些类或其部分将是一个耗时的噩梦。

这就是为什么我要求有知识的人至少列出我需要复制 JTextArea 的类,然后我会弄清楚如何组合它们。

因为,如果我现在开始学习挥杆核心机制,可能需要几天和几周的时间才能弄清楚,但是对于知道的人来说,只需几分钟就可以列出我需要集中精力的所有课程注意。

我想在这里走捷径。我不想完全理解摇摆,我只是想让这个东西工作。默认间距太低一个像素,我想做的就是让它高那个像素。我不想知道画家是如何将组件绘制到屏幕上的,我只想知道它是从哪里调用的以及它自称为什么......

感谢任何花时间的人。

4

1 回答 1

6

我想更改 JTextArea 行之间的间距

我的第一个想法是覆盖javax.swing.JTextArea#getRowHeight就足够了。javadoc明确指出

定义行高的含义。这默认为字体的高度。

所以我希望通过覆盖这个方法,你可以调整定义,你会得到更多的行间距。糟了,没用。快速搜索 JDK 中该方法的用法也发现了同样的情况。主要是用来计算一些尺寸的,但是在组件内部绘制文字的时候肯定不会用到。

通过查看该javax.swing.text.PlainView#paint方法的源代码,我看到FontMetrics使用了 ,并且您可以在JTextArea. 所以第二种方法是扩展JTextArea(bwah,扩展 Swing 组件,但它是为了概念验证)

  private static class JTextAreaWithExtendedRowHeight extends JTextArea{
    private JTextAreaWithExtendedRowHeight( int rows, int columns ) {
      super( rows, columns );
    }

    @Override
    public FontMetrics getFontMetrics( Font font ) {
      FontMetrics fontMetrics = super.getFontMetrics( font );
      return new FontMetricsWrapper( font, fontMetrics );
    }
  }

该类FontMetricsWrapper基本上代表了除getHeight方法之外的所有内容。在那个方法中,我在委托的结果中添加了 10

@Override
public int getHeight() {
  //use +10 to make the difference obvious
  return delegate.getHeight() + 10;
}

这会导致更多的行间距(以及一个太长的插入符号,但可能可以调整)。

一个小屏幕截图来说明这一点(不像其他一些那样好,但它表明这种方法可能有效):

普通文本区域和扩展文本区域之间的区别

小免责声明:这感觉就像一个丑陋的黑客,可能会导致意想不到的问题。我确实希望有人提出更好的解决方案。

于 2012-10-25T21:56:56.953 回答