当前位置: 首页 > 知识库问答 >
问题:

无法理解JPanel setBackground方法的行为

孟意致
2023-03-14

如果未调用super.paint组件父方法,则JPanel.set后台方法不执行任何操作(尽管不透明属性是true)。

我在这里阅读了很多关于这个问题的类似问题,在每一个问题中,我都只找到了没有解释的解决方案,这有助于我理解为什么在将JPanel添加到JFrame之前编写方法时会改变JPanel的背景色,而当在paintComponent内写入setBackground时,没有任何更改(仅当调用前面提到的父亲的paintComponent方法时)。它是否与图形对象有关?

我试图将JBoard不透明属性更改为true并使用setbackground(COLOR. BLACK)中的油漆组件()方法我在扩展JBoard的类中重写了

  paintComponent(Graphics g)
    {
      this.setOpaque(true);
      this.setBackground(COLOR.BLACK);
    }

我希望JPanel的背景色为黑色

相反,背景色是默认颜色


共有1个答案

楚勇
2023-03-14
匿名用户

好吧,首先,如果你使用的是油漆组件(图形g)方法,你需要在里面的第一行是:super.paint组件(g)否则你会破坏油漆链。

这将允许父组件在对其进行任何自定义之前绘制默认组件。如果你不这样做,就像在一张纸上画一幅画,想象一个圆,然后切割那个圆,然后尝试在外面画画。

这里有一个更深入的答案,告诉你如何做到超级。油漆组件(g)工作

但是我不会写

this.setOpaque(true);
this.setBackground(COLOR.BLACK);

在paintComponent(…)方法内部,因为它被多次调用,并且您无法控制何时调用它。我会把这些行放在一个构造函数中,除非你想稍后在你的程序中修改它,而它正在被绘制,这取决于你的程序的状态或者渐变。

对于这部分:

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

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

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

从文档中:

JPanel有一个UI委托,它自己执行背景绘制。您可以使用super调用它。paintComponent(g)并传递图形组件,以防止不可撤销的更改,例如图形。翻译

您的JPanel知道如何绘制其子对象,但需要一些帮助来绘制自身,而这些帮助来自其父对象。

当我提到“打破绘制链”时,我并不是说什么都不会绘制,而是说你会得到奇怪的行为,比如JPanel的背景消失或没有设置。

此外,如果我发送到setbackground方法的参数是随机颜色(使用Random对象),则会发生一些奇怪的事情。尽管我没有做任何事情(不最小化、不调整大小等),但JGroup很快就会改变颜色。你能考虑为什么吗?

正如我之前所说,paintComponent被调用多次,您无法控制何时调用它,甚至移动鼠标或其他东西都会触发面板重新绘制。

 类似资料:
  • 我使用的是spring boot 2.1.4,它依赖于执行器。我想为执行器和我的应用程序配置单独的身份验证和授权机制。我阅读了多个HttpSecurity,并将我的WebSecurityAdapter配置如下: 注意:我暂时禁用了表单登录 当我运行卷曲请求时 我能看到输出。似乎Spring的安全感从未存在过。当我启用表单登录时,我会看到spring登录屏幕。我观察到的另一个行为是,如果我将/位置的

  • 在维基百科中,背包的算法如下: 我在网上找到的所有例子的结构都是一样的<我无法理解的是,这段代码是如何考虑到最大值可能来自较小的背包这一事实的?E、 如果背包容量为8,那么最大值可能来自容量7(8-1)<我找不到任何逻辑来考虑最大值可能来自较小的背包。这是错误的想法吗?

  • 问题内容: 对于没有JS经验的人,您对学习Node.js有什么建议? 我在论坛上阅读了很多有关事件驱动,非阻塞,异步,回调等内容的信息,但我不知道那是什么! 在哪里可以学习基础知识,以便理解所有术语以及将来的node.js? 谢谢! 问题答案: 您提到的概念(事件驱动,非阻塞,异步,回调)不是特定于JavaScript的,在更一般的上下文中理解它们非常有价值。它们都围绕着优雅地处理我们无法控制的资

  • 我是Python初学者。我对Python中的正则表达式有所了解。例如:\d指的是匹配0个或更多的数字。 上面的表达式-第3行-在做什么?更具体地说,写有什么意义?

  • 我正在通过Android Studio中的一个应用程序工作,该应用程序使用学校意图传递数据。我已经创建了传递数据的对象,并启动了,但是我不断收到一个警告,说我的方法无法解析。有什么想法吗?提前谢了。

  • 正如文件所述: Android O允许您通过在res/字体/文件夹中添加字体文件来捆绑字体作为资源。 结果: 您可以使用getFont(int)方法检索字体,其中需要传递要检索的字体的资源标识符。此方法返回Typeface对象。这将对字体的第一个重量或样式变体(如果是字体系列)进行编码。然后可以使用字体。create(typeface,style)方法来检索特定样式。 注意:TextView已经为