我有一个带有 3 个内部面板的面板,所有面板都使用 TitledBorder
。第三个内部面板有许多使用 GradientPaint 绘制的自定义文本字段。文本字段来自扩展 JTextField
的自定义类,并使用重写的 paintComponent
方法以及 MouseListener
,以便当鼠标进入文本字段时区域渐变颜色略有变化(当鼠标离开文本字段时再次变回原样)。
问题是,当这些文本字段位于带有 TitledBorder(顺便说一下,它是复合边框)的面板内时,渐变颜色变化的效果不太好。我的意思是,他们的响应速度不够快,但是当他们不在这样的面板中时,他们的响应很好(我已经对此进行了测试)。
我认为问题出在边框本身,所以我尝试重写 TitledBorder
的 paintBorder()
方法,每当此方法出现时我都会添加一条打印语句调用来绘制边框...似乎每次鼠标进入文本字段的区域(并且渐变颜色发生变化)时,都会再次绘制 TitledBorder
。如果我快速将鼠标指针移过所有文本字段(它们只是其中的 4 个),那么文本字段会再次绘制(这是正常的),但复合 TitledBorder
每次也会绘制,我猜这会导致性能问题。
我的问题很简单,有什么方法可以告诉 Java 每当鼠标在面板的内部组件上移动时不要再次绘制面板的 TitledBorder
?
我知道这有时可能会导致问题,例如,如果我有一个带有组合框的小标题边框面板:如果我单击该组合框,弹出菜单可能会隐藏面板边框的一部分(前提是组合框靠近边框的底部),因此当弹出菜单本身再次隐藏时,应重新绘制边框,否则会在弹出菜单和边框重叠的空间留下“空白”区域。
但是在前面的情况下,面板只有文本字段,并且当鼠标在面板区域移动时不需要再次绘制边框,是否可以阻止 paintComponent()
如果可以的话,如何进行? (或者我应该尝试一些我没有想到的完全不同的东西 - 抱歉我经验不足)。
我可以提供渐变文本字段 paintComponent()
方法的代码以及 mouseEntered()
上发生的更改,但我认为问题的原因很清楚,而且我的假设为什么会发生这种情况是正确的(如果我错了请纠正我)...
编辑:
好吧,在尝试创建 sscce 时,我发现了我非常愚蠢的错误。我使用的是 CustomTitledBorder 类,而不是标准的 TitledBorder 类:
1) 消除了标题边框右侧添加的 2 个额外像素 2) 使用复合边框和不同的字体(palatino 粗体)。
问题是 palatino 字体没有存储在内存中,而是在每次调用自定义类的构造函数时从磁盘读取。所以每次调用paintBorder()时也会调用它。因此,每次鼠标移到具有上述边框的面板中的文本字段上时都会调用它。这是非常愚蠢的,我对此感到抱歉(我花了一天多的时间试图找出性能问题)。
这并没有回答我的问题,尽管如何避免每次鼠标悬停在文本字段上时执行paintBorder,但它不再需要了(而且我不确定它是否可以接受)。
最佳答案
关于java - 带 TitledBorder 的面板中的渐变文本字段 - 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12123976/