这个问题可能看起来不是很有技术性,但出于好奇,我想知道:
我编写的裸/原始 Swing 代码如何变成出色的图形应用程序?
例如:
就像我们让 JFrame 可见,或者我们在其上放置一个 JButton 时一样。谁让它发生?操作系统或 Java 或 JVM。
谁让颜色出现?
幕后的过程是怎样的?
我问这个可能是因为这是我人生中第一次制作 RealWorld 图形应用程序,这些问题突然出现在我的脑海中!
提前致谢!
在 Swing 中,所有 GUI 组件都完全用 Java 编写并使用 Java 呈现。例如,JButton 将由 Java 绘制,而不是由任何内部操作系统的东西绘制。因此,Swing 组件被称为“轻量级组件”,因为它们是由 Java 而不是由操作系统(或任何本机小部件工具包)管理和呈现的。
请注意,Java 也有一个称为 AWT 的工具包。Swing 基于 AWT 的嵌套和继承方法,不同之处在于它使用操作系统创建本机小部件。
所以在某些时候,Swing 将不得不在屏幕上创建一个窗口并在其上绘图。实际创建窗口的魔法由 AWT 处理。请注意,JFrame
extend from java.awt.Frame
which 意味着尽管 JFrame 可能主要由 Java 呈现,但它由重量级的本机 OS 窗口支持。
简而言之,有一个 AWT 工具包,它是执行所有窗口管理和绘图的层。它在 JVM 中调用本机平台特定代码。它还负责java2d绘图。它可以使用加速的 directx 或 opengl 管道。
Swing是在它之上开发的。Swing 实际上使用纯 Java 代码绘制每个按钮和每个对象。绘图被处理为决定如何绘制组件的当前外观。因此,您可以覆盖他们的绘制方法,并添加一些额外的东西而不会出现任何问题。
Metal 和 Nimus LaF 是 100% java2d 绘制的,所以在它们里面你会发现像 drawRectangle 和 drawLine 这样的东西来绘制组件。原生外观和感觉,如 windows、gtk,访问当前操作系统主题以绘制类似于原生小部件的东西。这就是为什么它们并不总是看起来像原生应用程序。
还有其他用于 java 的 gui 工具包,如 SWT,例如在 Eclipse 中使用。它所做的是从 AWT 获取窗口,然后将 100% 本机小部件放在上面。它与操作系统更好地集成,看起来更好,工作更快,使用更少的内存。但是有了它,您必须使用特定于操作系统的本机库来分发您的应用程序,并且与 Swing 相比,它的可定制性较低。
我不知道所有细节,但实际的图形是通过 JVM 本身通过 swing/awt 包显示/渲染的。