Java 自定义swing JTextComponent

Java 自定义swing JTextComponent,java,swing,jtextarea,nimbus,jtextcomponent,Java,Swing,Jtextarea,Nimbus,Jtextcomponent,我想创建一个JTextArea,它看起来像JTextArea,行为像JTextArea,响应像JTextArea,说话像JTextArea,移动像JTextArea,等等,但不是JTextArea 简而言之,我想创建一个100%基于JTextArea的定制swing组件。一旦我这样做了,我就能够改变JTextArea的不同的硬编码属性,并创建自己的定制JTextArea。没有预定义的swing组件是按照我需要的方式设计的,但是JTextArea是最接近的,这就是我选择它的原因 我想更改JText

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

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

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

我不是在尝试扩展JTextArea,我是在尝试创建一个自定义JTextArea,如中所示,其中包含更改的硬编码属性,这些属性是不可配置的trought JTextAreas方法。

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

弄明白这一点需要花费很多时间,也不能真正解决我的问题

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

我已经研究了swing源代码,其中包含了所有内容。考虑到我对核心swing结构和机制一无所知,弄清楚在创建JTextArea时使用了哪些类或它们的部分将是一场耗时的噩梦

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

因为,如果我现在开始学习swing core力学,我需要几天甚至几周的时间才能弄清楚,但是对于知道的人来说,列出我需要集中注意力的所有课程只需要几分钟

我想在这里抄近路。我不想完全理解swing,我只想让它工作。默认间距太小了一个像素,我只想把它调高一个像素。我不想知道画家是如何在屏幕上绘制组件的,我只想知道它是从哪里来的,它自己叫什么

感谢所有花时间的人

我想更改JTextArea行之间的间距

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

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

因此,我希望通过重写此方法,可以调整定义,并获得更多行间距。糟糕,没用。快速搜索JDK中该方法的用法,也发现了同样的情况。它主要用于计算某些尺寸,但在构件内部绘制文本时肯定不会使用

通过查看
javax.swing.text.PlainView#paint
方法的源代码,我发现使用了
FontMetrics
,并且可以在
JTextArea
中轻松覆盖。因此,第二种方法是扩展
JTextArea
(bwah,扩展Swing组件,但这是为了概念证明)

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

@Override
public int getHeight() {
  //use +10 to make the difference obvious
  return delegate.getHeight() + 10;
}
这会导致更多的行间距(和一个插入符号,它太长了,但可能可以调整)

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


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

为什么不让你的班级扩展JTextArea?这就是OOOh的重点,而且,我不认为有人能在这个网站上“引导”你完成这项工作,因为这将主要涉及你对源代码的学习,这可能需要几周的时间才能让你完全理解它。投票结束这个问题,因为这个问题在这个网站上实在无法回答。re
“我想在这里走捷径。我不想完全理解swing,我只想让它工作。”
——真的吗?“真的吗?”卡洛夫茨基120诚实地说,你应该考虑解释你想要达到的目标,而不是说JTextArea不能做到这一点。许多元素可以通过XxxUI属性进行配置,但它们在API中不直接可见。因此,如果你解释一下你想要达到的目标,我们可能会找到一种更简单的“标准”方法。在你的车上加一个排气管,你下次开车时可能会死于一氧化碳;-)或者换言之:如果不了解更多关于内部的信息,就绝对无法创建像textComponent这样复杂的自定义组件。。(或者我是:-)1投票结束这个问题给你1+分!但请记住,他坚决反对扩大这一领域。为什么?只有上帝知道。你应该在他的另一个问题上发一个悬赏:@HovercraftFullOfEels从前面的问题来看,我怀疑他在其他地方做错了什么,以至于他抓住了救命稻草。。。只是说+1为了更好地挖掘,想不到设置行距是不受支持的,即使是我祖父的打字机也能做到:-)@kleopat
@Override
public int getHeight() {
  //use +10 to make the difference obvious
  return delegate.getHeight() + 10;
}