我有一个面板,有3个内面板,都使用 TitledBorder
. 第三个内部面板有许多用 GradientPaint
. textfields来自一个扩展 JTextField
并使用重写的 paintComponent
方法以及 MouseListener
,这样当鼠标进入文本字段区域时,渐变颜色会稍微改变(当鼠标离开文本字段时,渐变颜色会再次改变)。
问题是,当那些文本字段位于具有标题边框(顺便说一下,是复合边框)的面板中时,渐变颜色的更改不会很好地执行。我的意思是他们的React不够快,但是当他们不在这样的小组中时,他们的React很好(我已经测试过这个)。
我认为问题是边界本身,所以我试图覆盖边界 TitledBorder
的 paintBorder()
方法中,每当调用此方法绘制边框时,我都会添加一个print语句。。。而且似乎每次鼠标进入文本字段的区域(渐变颜色改变)时 TitledBorder
又被画了一遍。如果我将鼠标指针快速移动到所有文本字段上(它们只是其中的4个),那么文本字段将再次被绘制(这是正常的),但是复合 TitledBorder
我猜这会导致性能问题。
我的问题很简单,有没有办法告诉java不要再画面板的颜色 TitledBorder
每次鼠标在面板的内部组件上移动时?
我知道这有时可能会导致问题,例如,如果我有一个带有组合框的小标题边框面板:如果我单击该组合框,弹出菜单可能会隐藏面板边框的一部分(前提是组合框靠近边框的底面),因此,当弹出菜单本身被再次隐藏时,边框应该被再次绘制,否则它会在弹出菜单和边框重叠的地方留下一个“空白”区域。
但是在前面的情况下,面板只有文本字段,当鼠标在面板区域移动时,没有必要再次绘制边框,是否可以防止 paintComponent()
如果是,怎么打(或者我应该尝试一些完全不同的,我没有想到-对不起,我不是很有经验)。
我可以提供梯度文本字段的代码 paintComponent()
方法以及发生在 mouseEntered()
但我认为问题的原因是明确的,我的假设是正确的(如果我错了请纠正我)。。。
编辑:
好吧,当我通过我的自定义类试图使sscce我发现了我非常愚蠢的错误。我使用的是CustomTitleBorder类,而不是标准的TitleBorder:
1) 消除了添加在标题边框右侧的2个额外像素2)使用了复合边框和不同的字体(palatino粗体)。
问题是,palatino字体没有存储在内存中,而是每次调用自定义类的构造函数时都从磁盘中读取。所以每次调用paintborder()时也会调用它。因此,每当鼠标移动到面板中具有上方边框的文本字段上时,就会调用它。这是非常愚蠢的,对此我很抱歉(我花了一天多的时间试图解决性能问题)。
这并不能回答我关于如何避免每次鼠标移到文本字段上时都执行paintborder的问题,但它已经不再需要了(我也不确定它是否可以接受)。
1条答案
按热度按时间qqrboqgw1#
将渐变缓存在
BufferedImage
,如这里和这里所示。同时考虑TexturePaint
,如图所示。