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

时间:2012-08-25 17:04:45

标签: java swing gradient jtextfield paintcomponent

我有一个带有3个内部面板的面板,它们都使用TitledBorder。第三个内部面板包含许多使用GradientPaint绘制的自定义文本字段。文本字段来自自定义类,其扩展JTextField并使用覆盖paintComponent方法和MouseListener,因此当鼠标进入文本字段区域时,渐变颜色会稍微改变(并且会发生变化)当鼠标离开文本字段时再次返回。)

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

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

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

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

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

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

编辑:

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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