1

我有一个带有 3 个内部面板的面板,它们都使用TitledBorder. 第三个内部面板有许多自定义文本字段,用GradientPaint. 文本字段来自一个自定义类,该类扩展JTextField并使用覆盖paintComponent方法以及 a MouseListener,因此当鼠标进入文本字段区域时,渐变颜色会略有变化(当鼠标离开文本字段时会再次变回)。

问题在于,当这些文本字段位于具有 TitledBorder 的面板内时(顺便说一下,这是一个复合边框),渐变颜色的变化效果不佳。我的意思是他们的反应不够快,但是当他们不在这样的小组中时,他们的反应很好(我已经对此进行了测试)。

我认为问题出在边框本身,所以我尝试覆盖TitledBorder'paintBorder()方法,每当调用此方法来绘制边框时,我添加了一个 print 语句......似乎每次鼠标进入文本字段的区域时(并且渐变颜色发生变化)TitledBorder再次绘制。如果我将鼠标指针快速移动到所有文本字段(它们只是其中的 4 个),则再次绘制文本字段(这是正常的),但TitledBorder每次也会绘制复合物,我猜这会导致性能问题。

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

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

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

我可以提供渐变文本字段paintComponent()方法的代码和发生的变化,mouseEntered()但我认为问题的原因很清楚,我对它发生原因的假设是正确的(如果我错了,请纠正我)......

编辑:

好的,在通过我的自定义类尝试制作 sscce 时,我发现了我非常愚蠢的错误。我使用的不是标准的 TitledBorder,而是一个 CustomTitledBorder 类:

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

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

这并没有回答我的问题,尽管每次鼠标悬停在文本字段上时如何避免执行paintBorder,但不再需要它(而且我不确定它是否可以接受)。

4

1 回答 1

2

将渐变缓存在 a 中BufferedImage,如此此处所示。也考虑一下,这里说明一下。TexturePaint

于 2012-08-25T18:16:02.813 回答