无法理解 JPanel setBackground 方法的行为
Can't understand JPanel setBackground method behavior
JPanel.setBackground
方法不执行任何操作(尽管 opaque
属性是 true
)如果 super.paintComponent
父方法未被调用。
我在这里阅读了很多关于这个问题的类似问题,在每一个问题中我都只找到了没有解释的解决方案,这帮助我理解了为什么 setBackground
在添加 JPanel
到 JFrame
改变了 JPanel
背景颜色,而当 setBackground
写在 paintComponent
里面时什么都没有改变(只有在调用父亲的 paintComponent
方法时如前所述)。
它与 Graphics
对象有某种关系吗?
我试图将 JPanel
的 opaque
属性更改为 true
并在 paintComponent()
方法中使用 setBackground(COLOR.BLACK)
我在 class 扩展 JPanel
paintComponent(Graphics g)
{
this.setOpaque(true);
this.setBackground(COLOR.BLACK);
}
我希望 JPanel
背景颜色为黑色
相反,背景颜色是默认颜色
嗯,首先,如果你使用 paintComponent(Graphics g)
方法,你需要在里面的第一行是:super.paintComponent(g)
否则你会破坏 paint-chain。
这将允许 parent 组件绘制默认组件,在 您对其进行的任何自定义之前。如果你不这样做,好吧,就像在一张纸上画画,想象一个圆,然后切割那个圆,然后尝试在外面画画。
这里有更多 in-depth 对
的回答
不过我不会写
this.setOpaque(true);
this.setBackground(COLOR.BLACK);
在 paintComponent(...)
方法中,因为它会被调用多次,您无法控制何时调用它。我会将这些行放在构造函数中,除非您想稍后在程序中根据程序状态或渐变绘制时更改它。
对于这部分:
why setBackground method when written before adding the JPanel to JFrame changes the JPanel background color
老实说,我不明白你的意思。
Why do you say that if i won't call super.paintComponent(),it will break the chain? It's still drawing all the shapes and lines i want using graphics object.
来自docs:
JPanel
有一个 UI 委托,它为自己执行背景绘制。您使用 super.paintComponent(g)
调用它,我们传递 Graphics
组件以防止不可撤销的更改,例如 Graphics.translate
你的 JPanel
知道如何绘制它的 children,但需要一些帮助来绘制它自己,而这种帮助来自它的 parent。
当我提到 "break the paint chain" 时,我并不是说什么都不会画,而是你会遇到奇怪的行为,例如 JPanel
的背景之一消失或未设置。
In addition,something weird happens if the argument i'm sending to setBackground method is a random color(using Random object). JPanel changing color very quickly although i'm not doing anything(not minimizing,not resizing,etc).Can you consider why?
正如我之前所说,paintComponent
被多次调用,您无法控制何时调用它,即使移动鼠标或其他东西也会触发面板重新绘制。
JPanel.setBackground
方法不执行任何操作(尽管 opaque
属性是 true
)如果 super.paintComponent
父方法未被调用。
我在这里阅读了很多关于这个问题的类似问题,在每一个问题中我都只找到了没有解释的解决方案,这帮助我理解了为什么 setBackground
在添加 JPanel
到 JFrame
改变了 JPanel
背景颜色,而当 setBackground
写在 paintComponent
里面时什么都没有改变(只有在调用父亲的 paintComponent
方法时如前所述)。
它与 Graphics
对象有某种关系吗?
我试图将 JPanel
的 opaque
属性更改为 true
并在 paintComponent()
方法中使用 setBackground(COLOR.BLACK)
我在 class 扩展 JPanel
paintComponent(Graphics g)
{
this.setOpaque(true);
this.setBackground(COLOR.BLACK);
}
我希望 JPanel
背景颜色为黑色
相反,背景颜色是默认颜色
嗯,首先,如果你使用 paintComponent(Graphics g)
方法,你需要在里面的第一行是:super.paintComponent(g)
否则你会破坏 paint-chain。
这将允许 parent 组件绘制默认组件,在 您对其进行的任何自定义之前。如果你不这样做,好吧,就像在一张纸上画画,想象一个圆,然后切割那个圆,然后尝试在外面画画。
这里有更多 in-depth 对
不过我不会写
this.setOpaque(true);
this.setBackground(COLOR.BLACK);
在 paintComponent(...)
方法中,因为它会被调用多次,您无法控制何时调用它。我会将这些行放在构造函数中,除非您想稍后在程序中根据程序状态或渐变绘制时更改它。
对于这部分:
why setBackground method when written before adding the JPanel to JFrame changes the JPanel background color
老实说,我不明白你的意思。
Why do you say that if i won't call super.paintComponent(),it will break the chain? It's still drawing all the shapes and lines i want using graphics object.
来自docs:
JPanel
有一个 UI 委托,它为自己执行背景绘制。您使用 super.paintComponent(g)
调用它,我们传递 Graphics
组件以防止不可撤销的更改,例如 Graphics.translate
你的 JPanel
知道如何绘制它的 children,但需要一些帮助来绘制它自己,而这种帮助来自它的 parent。
当我提到 "break the paint chain" 时,我并不是说什么都不会画,而是你会遇到奇怪的行为,例如 JPanel
的背景之一消失或未设置。
In addition,something weird happens if the argument i'm sending to setBackground method is a random color(using Random object). JPanel changing color very quickly although i'm not doing anything(not minimizing,not resizing,etc).Can you consider why?
正如我之前所说,paintComponent
被多次调用,您无法控制何时调用它,即使移动鼠标或其他东西也会触发面板重新绘制。