JPanel.setBackground
方法不执行任何操作(尽管opaque
属性为true
),如果未调用super.paintComponent
父方法。
我在这里已经阅读了许多与此问题类似的问题,在每个问题中,我仅找到了没有解释的解决方案,这些解决方案有助于我理解为什么在添加{{1 }}到setBackground
会改变JPanel
的背景色,而当JFrame
写在JPanel
内时,什么都不会改变(仅当已经调用父亲的setBackground
方法时提到)。
它与paintComponent
对象有关吗?
我尝试将paintComponent
的{{1}}属性更改为Graphics
,并在JPanel
方法中使用了opaque
,在扩展了{ {1}}
true
我希望setBackground(COLOR.BLACK)
背景色为黑色
相反,背景颜色是默认颜色
答案 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
被调用了几次,并且您无法控制何时调用它,即使移动鼠标或其他操作也会触发面板重新绘制。