Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不直接在JFrame中绘制呢_Java_Swing_Paint_Paintcomponent - Fatal编程技术网

Java 为什么不直接在JFrame中绘制呢

Java 为什么不直接在JFrame中绘制呢,java,swing,paint,paintcomponent,Java,Swing,Paint,Paintcomponent,有人能解释一下为什么我不应该使用paint方法直接在JFrame窗口中绘制,而我应该在JFrame窗口中使用paintComponent方法和JPanel 提前感谢。三个主要原因 顶级容器不是双缓冲的,这会在重新绘制帧时导致闪烁,是的,您可以实现自己的双缓冲,但是 在框架内绘制不考虑框架边界,这意味着可以在框架下绘制。框架边框也是特定于平台/外观的,这意味着尺寸会发生变化 对于摆动式车窗,车窗上已经存在部件,这意味着它们在大多数情况下都会涂漆(或被涂漆),因为摆动式车窗中的涂漆引擎经过优化,因此

有人能解释一下为什么我不应该使用
paint
方法直接在
JFrame
窗口中绘制,而我应该在
JFrame
窗口中使用
paintComponent
方法和
JPanel

提前感谢。

三个主要原因

  • 顶级容器不是双缓冲的,这会在重新绘制帧时导致闪烁,是的,您可以实现自己的双缓冲,但是
  • 在框架内绘制不考虑框架边界,这意味着可以在框架下绘制。框架边框也是特定于平台/外观的,这意味着尺寸会发生变化
  • 对于摆动式车窗,车窗上已经存在部件,这意味着它们在大多数情况下都会涂漆(或被涂漆),因为摆动式车窗中的涂漆引擎经过优化,因此很难产生合理的结果
  • 对于第2点,框架装饰在“窗口”边界内绘制,而不是在其外部绘制

    看看

    欲知详情


    花点时间通读一遍,了解更多细节

    @ChristopheD不太清楚,这是进一步阅读的好建议。在这种情况下,他们询问了Swing组件的绘画方法与在Swing组件上使用窗口/顶层容器之间的区别——只是说;)@程序员:哎呀,恐怕这次重复搜索有点太快了。感谢您指出这一点。-1,您在上一个问题中获得了到Swing教程的链接。你看过教程了吗?它还包含一个关于
    自定义绘制的部分
    ,对Swing中的绘制进行了高级概述。本教程还包含一个链接,指向更深入的绘画讨论。阅读这两个教程,然后问一个特定的问题,如果你有什么不明白的地方。@NarutoBijuMode“如果我们所有人都有时间阅读所有这些甲骨文教程,我永远不会在这里问一个问题”这不是真的。你的第一个位置是教程,第二个位置是论坛,你用它来要求澄清你不理解的地方。如果你不愿意投入时间或精力来自学,为什么其他人也不愿意,我们都有时间限制well@NarutoBijuModeCamickr只是想告诉你,先做一些研究,在某些方面可以回答一些问题,但这些问题会污染论坛,这并不是什么意思,抱歉,如果您觉得这很烦人或冒犯,那不是我们的意图,我们的意图是让您成为一个更好的、自我支持的开发人员。当你得到的答案不合适时,问一个答案并不能教会你(这种情况经常发生在这里)。在要求澄清一个主题之前,能够研究一个主题,哪怕是一点点,都会让你更好地看到好的答案。我是java和swing的初学者,我不理解第一个原因,因为第二个原因是有没有办法证明画图在框架边界下,因为对我来说,在windows上似乎不可能,关于第三个问题,你能给我举一些例子来进一步澄清吗。谢谢。@NarutoBijuMode框架装饰画在窗口的边界内,而不是在窗口的外部,这意味着窗口的位置和大小总是正确的(不需要修改来调整装饰的大小)。双缓冲是一种用于提高绘制性能的技术,而不是尝试直接绘制到具有自身开销的屏幕设备,而是绘制一个屏幕外缓冲区,并通过将缓冲区绘制到屏幕来执行单个更新。它减少了更新屏幕时的闪烁,我认为第二个是不在帧内绘制的最佳理由。谢谢你的例子:)