无法理解JPanel setBackground方法的行为

时间:2019-06-24 18:00:38

标签: java swing overriding jlabel paintcomponent

JPanel.setBackground方法不执行任何操作(尽管opaque属性为true),如果未调用super.paintComponent父方法。

我在这里已经阅读了许多与此问题类似的问题,在每个问题中,我仅找到了没有解释的解决方案,这些解决方案有助于我理解为什么在添加{{1 }}到setBackground会改变JPanel的背景色,而当JFrame写在JPanel内时,什么都不会改变(仅当已经调用父亲的setBackground方法时提到)。 它与paintComponent对象有关吗?

我尝试将paintComponent的{​​{1}}属性更改为Graphics,并在JPanel方法中使用了opaque,在扩展了{ {1}}

true

我希望setBackground(COLOR.BLACK)背景色为黑色

相反,背景颜色是默认颜色

1 个答案:

答案 0 :(得分:1)

好吧,首先,如果您使用的是paintComponent(Graphics g)方法,那么您需要在其中包含的第一行是:super.paintComponent(g),否则您将破坏漆膜链。

这将允许父组件在您对其进行任何自定义之前之前绘制默认组件。如果您不这样做,那就好比在一张纸上画一张图,想象一个圆圈,然后切开该圆圈,然后尝试在外部绘制。

这是对How does super.paintComponent(g) works的更深入的答案

但是我不会写

this.setOpaque(true);
this.setBackground(COLOR.BLACK);
paintComponent(...)方法内

,因为它被多次调用,所以您无法控制何时调用它。我会把这些行放在构造函数中,除非您想在以后的程序中更改它,同时根据程序的状态或渐变来绘制它。

对于这一部分:

  

为什么在将JPanel添加到JFrame之前编写setBackground方法会更改JPanel背景颜色

老实说,我不明白你的意思。


  

你为什么说如果我不打电话给super.paintComponent(),它会打断链条?它仍在使用图形对象绘制我想要的所有形状和线条。

来自docs

JPanel有一个UI委托,它自己执行背景绘画。您使用super.paintComponent(g)进行调用,我们传递了Graphics组件以防止不可撤消的更改,例如Graphics.translate

您的JPanel知道如何绘制其子级,但是需要一些帮助来对其自身进行绘制,并且此帮助来自其父级。

当我提到“打破绘画链”时,我并不是说什么也不会绘画,但是您会得到奇怪的行为,例如JPanel的背景之一消失或没有被设置。

  

此外,如果我发送给setBackground方法的参数是随机颜色(使用Random对象),则会发生一些奇怪的事情。 JPanel尽管我什么都没做(没有最小化,没有调整大小等),但颜色变化非常快。您能考虑为什么吗?

正如我之前说过的,paintComponent被调用了几次,并且您无法控制何时调用它,即使移动鼠标或其他操作也会触发面板重新绘制。