无法理解 JPanel setBackground 方法的行为

Can't understand JPanel setBackground method behavior

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

我在这里阅读了很多关于这个问题的类似问题,在每一个问题中我都只找到了没有解释的解决方案,这帮助我理解了为什么 setBackground 在添加 JPanelJFrame 改变了 JPanel 背景颜色,而当 setBackground 写在 paintComponent 里面时什么都没有改变(只有在调用父亲的 paintComponent 方法时如前所述)。 它与 Graphics 对象有某种关系吗?

我试图将 JPanelopaque 属性更改为 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 被多次调用,您无法控制何时调用它,即使移动鼠标或其他东西也会触发面板重新绘制。