自定义摆动JTextComponent

Kar*_*120 -2 java swing jtextarea nimbus jtextcomponent

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

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

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

我不是试图扩展JTextArea,我正在尝试创建一个自定义的JTextArea,就像在自定义swing组件中一样,改变了硬编码的属性,这些属性是不可配置的JTextAreas方法.

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

弄清楚这将花费大量时间,并不会真正解决我的问题.

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

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

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

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

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

感谢任何花时间的人.

Rob*_*bin 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 );
    }
  }
Run Code Online (Sandbox Code Playgroud)

FontMetricsWrapper级基本上代表了一切,除了getHeight方法.在那个方法中,我在委托的结果中添加了10

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

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

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

常规文本区域和扩展文本区域之间的差异

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

  • 给你1+!但请记住,他已经死定了JTextArea.为什么?主只知道. (2认同)
  • @kleopatra我更惊讶的是,重写`getRowHeight`方法只是调整一些大小,但是行高不受影响.这意味着当您创建一个包含30行(在构造函数中传递)的文本区域时,实际上最终会得到一个文本区域,其中首选大小允许超过30行... (2认同)