我看到了奇怪的行为。 L&F 套装是金属的。
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
如果我在 JPanel 上设置边框 border1,那么我在同一个 JPanel 上将边框更改为 border2,当工具提示经过 border2 时,重绘将重绘 border1。这种情况仅发生在 L&F Metal 上,使用 LineBorder、TitledBorder...
最佳答案
happens in Metal L&F only.
即使您没有专门设置 LAF,您仍然会遇到问题。
If I set a Border border1 on a JPanel, then I change the Border to border2 on the same JPanel, when a tooltip passes on border2, repaint redraws border1
它与工具提示无关。
只需单击几个方 block ,然后调整框架大小,所有边框就会重新漆成蓝色。
问题出在您的 ColorsBoard
类上。
您不应该重写 paintComponent()
方法来创建组件。
绘画方法仅用于绘画。
只要 Swing 确定需要重新绘制组件,就会调用paintComponent() 方法。这就是为什么调整框架大小也会导致问题。您正在重新创建所有组件。
解决办法:
- 不要重写paintComponent()方法!
- 在类的构造函数中创建所有组件
- 不要使用空布局。相反,请在面板上使用 GridLayout,然后将方 block 添加到网格中。
- 在构造函数中使用
setBackground(Color.LIGHT_GRAY)
设置背景
另外:
- 删除方法中的所有
synchronized
关键字。不需要它们。 - 不要使用“==”来比较对象。使用
equals(...)
方法。
关于java - BorderFactory 和 Metal L&F 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52769444/