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的类,然后我会弄清楚如何编写它们.
因为,如果我现在开始学习摇摆核心机制,我需要花费数天和数周的时间来解决这一问题,但对于知道的人来说,只需几分钟就可以列出我需要关注的所有课程.关注.
我想在这里采取捷径.我不想完全理解挥杆,我只是希望这件事能够发挥作用.默认间距是一个像素太低,我想做的就是让它像素更高.我不想知道画家如何在屏幕上绘制组件,我只想知道它在哪里被调用以及它自称为什么......
感谢任何花时间的人.
我想改变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)
这会导致更多的行间距(并且插入符太长,但可能会调整).
一个小截图来说明这一点(不如其他一些好,但它表明这种方法可能有效):

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