java - 带 TitledBorder 的面板中的渐变文本字段 - 性能问题

标签 java swing gradient jtextfield paintcomponent

我有一个带有 3 个内部面板的面板,所有面板都使用 TitledBorder。第三个内部面板有许多使用 GradientPaint 绘制的自定义文本字段。文本字段来自扩展 JTextField 的自定义类,并使用重写的 paintComponent 方法以及 MouseListener,以便当鼠标进入文本字段时区域渐变颜色略有变化(当鼠标离开文本字段时再次变回原样)。

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

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

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

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

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

我可以提供渐变文本字段 paintComponent() 方法的代码以及 mouseEntered() 上发生的更改,但我认为问题的原因很清楚,而且我的假设为什么会发生这种情况是正确的(如果我错了请纠正我)...

编辑:

好吧,在尝试创建 sscce 时,我发现了我非常愚蠢的错误。我使用的是 CustomTitledBorder 类,而不是标准的 TitledBorder 类:

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

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

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

最佳答案

将渐变缓存在 BufferedImage 中,如图 herehere 。另请考虑 TexturePaint,如图所示 here .

关于java - 带 TitledBorder 的面板中的渐变文本字段 - 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12123976/

相关文章:

java - 我如何将声音从原始 View 带到 ListView 并更改它们的名称?

java - 在字符串连接中使用 super 时编译失败

java - JTable 行编辑器

java - Netbeans 无法读取我的第二个表单

java - 在嵌套 JPanel 上绘制组件 (Java)

java - 清除第一行 jtextarea

python - tensorflow 梯度 - 获取所有 nan 值

image - Matlab梯度和OpenCV梯度给出不同的结果

html - 一个 html 按钮中的两种不同渐变

java - 使用 Java 在 Windows 上运行而不在 Linux 上运行的简单正则表达式