当前位置: 首页 > 面试题库 >

为什么必须使用paintComponent方法在Java中进行绘制?

钱朝明
2023-03-14
问题内容

我希望这个问题不会太笼统。我知道,要在JPanel您上进行绘制,您需要重写该paintComponent方法,并将所有绘制代码​​放入该方法中。我的问题是为什么!为什么Java似乎不允许/提供使用诸如panel.drawLine(x1,y1,x2,y2)或方法的绘图panel.drawText(text,x,y)?在delphi中,一切都变得如此简单。一定有一个原因我无法弄清楚。


问题答案:

那是因为这就是它的工作方式。它是以此方式设计的。但是我想你的问题是关于“为什么”

请记住,Swing大约在15年前问世。批评之一是该API太慢(事实是,它之所以缓慢是因为人们并不真正了解如何使用它,但这是另一回事了),因此在设计API时必须考虑性能。

涉及许多因素…

Swing使用被动绘画过程,这意味着将绘画请求发送到绘画子系统并计划(返回EDT)进行处理。绘画子系统决定应绘画的内容,时间和量。这是在亵渎油漆子系统时完成的。

这意味着您永远不会真正知道何时可以执行绘制循环,因此我们需要某种方式来响应这些请求。

多功能性是另一个因素。API足够抽象,以至于与组件的绘制位置无关(很多)。也就是说,您可能被涂到屏幕,打印机甚至图像上。这意味着您无需重复很多绘画代码即可使其在不同的设备上运行。

您也永远不知道组件何时可以显示(即何时将其附加到本机对等端)。这意味着图形上下文可能是null,因此拥有“
helper”方法实际上可能会引起更多问题。当paintComponent调用时,你(大部分)保证有一个有效的图形上下文要绘制的。

可扩展性将是另一个因素。不仅很容易重写paintComponent来更改某些组件绘制的方式,而且绘制系统也可以像当前情况一样提供扩展的Graphics上下文。当paintComponent(至少由paint子系统)调用时,它保证Graphics上下文将是的html" target="_blank">实例Graphics2D,它是的扩展Graphics,为API提供了许多重要的增强。

无需更改人们正在使用的基类就可以完成所有操作,因此,如果他们不想使用这些功能,则不受其影响。

您可能需要通读…

  • 在AWT和Swing中绘画
  • 被动渲染与主动渲染

更多细节

并记住“绘画很有趣”;)

其他想法

要考虑的其他考虑因素之一是,GraphicsAPI是绘画的核心,不仅考虑UI,而且考虑打印和图像处理。API与目标断开连接,从而具有更大的灵活性,但也具有通用性。

这意味着,如果您需要打印到打印机或渲染为图像,则可以使用与在屏幕上绘画相同的API。



 类似资料:
  • 我被一些奇怪的东西卡住了。我有一个带有JScrollPane的JFrame,其中包含一个比实际屏幕大得多的jPanel。我用圆柱画正方形,我希望这些正方形越过JPanel的右边框。(以便在向右滚动时显示它们。)但是使用paintComponents方法绘制的方块只是在JScrollPane的可见视口处停止。 下面是JFrame内部的JScrollPane的代码: public void initC

  • 本文向大家介绍为什么必须使用Twitter进行联网,包括了为什么必须使用Twitter进行联网的使用技巧和注意事项,需要的朋友参考一下 如果我们能够在线开发有价值的业务网络,那真是太棒了? 是的,通过“ Twitter”可以实现–实时通信枢纽成为一个出色的业务网络平台。通过在这种快节奏的环境中改进和实施我们的社交网络技能,Twitter可以用作构建强大的业务网络的起点。 对于Twitter的网络,

  • 问题内容: 即使等待1的linux手册页很好地说明了您需要让子进程不使其变成僵尸,但它根本无法说明原因。 我围绕一个Ever 循环计划了我的程序(这是我的第一个多线程程序,所以请原谅我的天真),该循环启动子进程,该子进程被ed淘汰,并确保自行终止。 我无法使用,因为这使并行计算变得不可能,因此我可能不得不添加一个存储子pid的进程表,并且不得不使用-不是立即执行,而是经过一段时间- 这是一个问题,

  • 在上面的代码中,为什么在< code>main()中强制提到< code>String args[]以及为什么我们得到< code > "[ljava . lang . String;@174e5edb"作为输出?

  • 问题内容: 当我使用关键字访问类中的非静态变量时,Java不会给出任何错误。但是当我不使用它时,Java会给出一个错误。为什么要使用? 我知道什么时候应该正常使用,但是这个示例与正常用法大不相同。 例: 问题答案: 首先声明变量,然后赋值。该类与此相同: 您无法执行此操作的原因是,在创建对象时尚未定义,但是对象本身(即)及其所有成员变量都存在。 这是每个的说明:

  • 问题内容: 如果我重写一个类两种方法,它必须确保,如果那么也必须是真实的。 有人可以告诉我一个简单的示例,如果违反了该示例,将会引起问题吗?我认为这与您使用该类作为Hashmap的键类型有关吗? 问题答案: 当然: 与: 从技术上讲应该是正确的,因为在两种情况下m == 3。 通常,HashMap的工作方式如下:它具有可变数量的通常称为“存储桶”的数量。存储桶的数量可以随时间变化(随着条目的添加和