自定义摆动JTextComponent

时间:2012-10-25 20:54:20

标签: java swing jtextarea nimbus jtextcomponent

我想创建一个看起来像JTextArea的JTextArea,像JTextArea一样,像JTextArea一样响应,像JTextArea一样说话,像JTextArea一样移动,但不是JTextArea。

为了缩短它,我想在JTextArea上创建一个100%的自定义swing组件。一旦我这样做,我将能够更改JTextArea的其他硬编码属性并创建我自己的自定义JTextArea。没有按照我需要的方式设计预定义的swing组件,但JTextArea是最接近的,这就是我选择它的原因。

我想改变JTextArea行的间距。不,我不想使用JtextPane,我已经尝试过,它不适用于我的程序,它不同地计算它的位置,它看起来不同,并且应用JtextArea边框只是进一步混乱。

我没有尝试扩展JTextArea,我正在尝试创建一个自定义的JTextArea,就像在custom swing component中一样,使用JTextAreas方法无法配置的已更改的硬编码属性。

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

确定这将花费大量时间,并不能真正解决我的问题。

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

我已经研究了摇摆源代码,它充满了各种各样的东西。确定在创建JTextArea时使用哪些类或它们的部分将是一个耗时的噩梦,因为我不知道核心的摆动结构和机制。

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

因为,如果我现在开始学习摇摆核心机制,我需要花费数天和数周的时间来解决这个问题,但对于知道的人来说,只需几分钟就可以列出我需要的所有课程把注意力集中在。

我正试图在这里采取捷径。我不想完全理解挥杆,我只是希望这件事能够发挥作用。默认间距是一个像素太低,我想做的就是让它像素更高。我不想知道画家如何在屏幕上绘制组件,我只是想知道它在哪里被调用以及它自称为什么......

感谢任何花时间的人。

1 个答案:

答案 0 :(得分: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;
}

这会导致更多行间距(并且插入符太长,但可能会调整)。

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

Difference between regular text area and extended one

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