Java 标题为Border的面板中的渐变文本字段-性能问题

Java 标题为Border的面板中的渐变文本字段-性能问题,java,swing,gradient,jtextfield,paintcomponent,Java,Swing,Gradient,Jtextfield,Paintcomponent,我有一个带有3个内部面板的面板,所有面板都使用标题边框。第三个内部面板有许多自定义文本字段,这些字段使用GradientPaint绘制。textfields来自一个自定义类,该类扩展了JTextField,并使用了一个重写的paintComponent方法和一个MouseListener,这样当鼠标进入textfield区域时,渐变颜色会稍微改变(当鼠标离开textfield时,渐变颜色会再次改变) 问题是,当这些文本字段位于带有标题边框(顺便说一下,是复合边框)的面板内时,渐变颜色的更改不会很

我有一个带有3个内部面板的面板,所有面板都使用
标题边框
。第三个内部面板有许多自定义文本字段,这些字段使用
GradientPaint
绘制。textfields来自一个自定义类,该类扩展了
JTextField
,并使用了一个重写的
paintComponent
方法和一个
MouseListener
,这样当鼠标进入textfield区域时,渐变颜色会稍微改变(当鼠标离开textfield时,渐变颜色会再次改变)

问题是,当这些文本字段位于带有标题边框(顺便说一下,是复合边框)的面板内时,渐变颜色的更改不会很好地执行。我的意思是,他们的反应不够快,但当他们不在这样一个小组中时,他们的反应很好(我已经测试过了)

我认为问题在于边框本身,所以我尝试覆盖
TitledBorder
paintBorder()
方法,在该方法中,每当调用此方法绘制边框时,我都会添加一条print语句。。。而且似乎每次鼠标进入文本字段区域(渐变颜色改变)时,
标题边框就会重新绘制。如果我在所有文本字段上快速移动鼠标指针(它们只有4个),那么文本字段将再次绘制(这是正常的),但复合
标题边框也会每次绘制,我想这会导致性能问题

我的问题很简单,有没有什么方法可以告诉Java不要每次鼠标在面板的内部组件上移动时都重新绘制面板的
标题边框

我理解这有时可能会导致问题,例如,如果我有一个带有组合框的小标题边框面板:如果我单击该组合框,弹出菜单可能会隐藏面板边框的一部分(前提是组合框靠近边框的底部),因此,当弹出菜单本身再次隐藏时,边框应再次绘制,否则将在弹出菜单和边框重叠的空间留下“空白”区域

但是,在前面的情况下,如果面板只有文本字段,并且当鼠标在面板区域移动时,不需要再次绘制边框,是否可以阻止调用
paintComponent()
,如果可以,如何进行?(或者我应该尝试一些我没有想到的完全不同的东西——对不起,我不是很有经验)

我可以提供渐变文本字段
paintComponent()
方法的代码以及在
mouseenternet()
上发生的更改,但我认为问题的原因很清楚,并且我对其发生原因的假设是正确的(如果我错了,请纠正我)

编辑:

好的,在我的自定义类中尝试进行sscce时,我发现了我的愚蠢错误。我使用的不是标准TitleBorder,而是CustomTitleBorder类:

1) 消除了在标题边框右侧添加的2个额外像素 2) 使用复合边框和不同字体(palatino粗体)

问题是palatino字体没有存储在内存中,而是在每次调用自定义类的构造函数时从磁盘读取。所以每次调用paintBorder()时也会调用它。因此,每当鼠标移动到面板上具有上述边框的文本字段上时,就会调用它。这太愚蠢了,对此我很抱歉(我花了一天多的时间试图解决性能问题)


这并不能回答我关于如何避免每次鼠标在文本字段上时都执行paintBorder的问题,但现在不再需要它了(我也不确定它是否可以接受)。

将渐变缓存在
缓冲图像中,如图和所示。也可以考虑<代码> TrutuFrase,说明。

张贴可能会加快对问题的分析和解决方案的探索。如果您不这样做,我们将不得不创建一个,我们将非常感谢您的努力。@HovercraftFullOfEels:谢谢您的评论,尝试使sscce我终于解决了。问题已经解决,但我喜欢您关于额外调整的提示,我肯定会尝试它们,所以我接受了这个答案…我对
字体感到惊讶,但听起来你用正确的方法解决了这个问题。您可能还想看看绘画主题。