【问题标题】:How does a Swing code turn into a real graphical applicationSwing 代码如何变成真正的图形应用程序
【发布时间】:2012-06-23 01:29:39
【问题描述】:

这个问题可能看起来不是很技术,但出于好奇,我想知道:

我编写的裸/原始 Swing 代码如何变成出色的图形应用程序?

例如:

  • 就像我们让 JFrame 可见,或者我们在其上放置一个 JButton 时一样。谁让它发生?操作系统或 Java 或 JVM。

  • 谁让颜色出现?

  • 幕后流程是怎样的?

我问这个可能是因为这是我人生中第一次制作 RealWorld 图形应用程序,这些问题突然出现在我的脑海中!

提前致谢!

【问题讨论】:

    标签: java swing graphics


    【解决方案1】:

    在 Swing 中,所有 GUI 组件都完全用 Java 编写并使用 Java 呈现。例如,JButton 将由 Java 绘制,而不是由任何内部操作系统的东西绘制。因此,Swing 组件被称为“轻量级组件”,因为它们是由 Java 而不是由操作系统(或任何本机小部件工具包)管理和呈现的。

    请注意,Java 也有一个名为 AWT 的工具包。 Swing 基于 AWT 的嵌套和继承方法,但它使用操作系统创建本机小部件。

    所以在某些时候,Sw​​ing 将不得不在屏幕上创建一个窗口并在其上绘图。实际创建窗口的魔法由 AWT 处理。请注意,JFrame 扩展自 java.awt.Frame,这意味着尽管 JFrame 可能主要由 Java 呈现,但它由重量级的原生操作系统窗口支持。

    【讨论】:

    • 这只是部分正确。最后,Java 2D API 依赖于特定于操作系统的函数在屏幕上绘制,并具有硬件加速图形(DirectX、OpenGL 等)
    • 更令人惊奇的是,您可以使用相同的 Java 程序,无需重新编译,并在另一个操作系统上运行它,它就可以正常工作。
    • @Bill:如果你想让你的 Swing 应用在所有平台和 LaF 上看起来都很好,那你真的很头疼 :)
    • 相同的外观和感觉 (LAF)(3d 派对),不同的平台对我来说效果很好。不想尝试多个 LAF。生命太短暂了。
    【解决方案2】:

    简而言之,有一个 AWT 工具包,它是执行所有窗口管理和绘图的层。它在 JVM 中调用本机平台特定代码。它还负责java2d绘图。它可以使用加速的 directx 或 opengl 管道。

    Swing 是在它之上开发的。 Swing 实际上使用纯 Java 代码绘制每个按钮和每个对象。绘图被处理为决定如何绘制组件的当前外观。因此,您可以覆盖他们的绘制方法,并添加一些额外的东西而不会出现任何问题。

    Metal 和 Nimus LaF 是 100% java2d 绘制的,所以在它们里面你会发现像 drawRectangle 和 drawLine 这样的东西来绘制组件。原生外观和感觉,如 windows、gtk,访问当前操作系统主题以绘制类似于原生小部件的东西。这就是为什么它们并不总是看起来像原生应用程序。

    还有其他用于 java 的 gui 工具包,如 SWT,例如在 Eclipse 中使用。它所做的是从 AWT 获取窗口,然后将 100% 本机小部件放在上面。它与操作系统更好地集成,看起来更好,工作更快,使用更少的内存。但有了它,您必须使用特定于操作系统的本机库来分发您的应用程序,并且与 Swing 相比,它的可定制性较低。

    【讨论】:

      【解决方案3】:

      我不知道所有细节,但实际的图形是通过 JVM 本身的 swing/awt 包显示/渲染的。

      【讨论】:

        猜你喜欢
        • 2022-07-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        相关资源
        最近更新 更多