7

通常,当我创建一个类时,例如Customer,我给它一些数据字段,即public int IdNumber;和一些方法,即public String getName(){...}。但仅此而已。我不能超越这一点,开始玩图形——我只能在课堂允许的范围内操作和组织数据。

我无法理解 JFrame 内部发生的事情。谁编写了 JFrame 类,他们是如何编写一个可以使框出现在屏幕上的类的?内部发生了什么导致这种情况发生?反正有模仿吗?

同样的问题适用于所有基于图形的 Java 类。我真的很想知道它是如何工作的,因为每次我使用其中一个时都会困扰我。

4

3 回答 3

4

Java 从awt (Abstract Windowing Toolkit) 开始,后来引入了swing

AWT中,平台事件处理循环被挂钩,事件被打包在自己的 java 类中,一个(非并行)事件处理队列/线程一个接一个地处理它们。Swing 继承了这一点。

AWT中,每个 GUI 组件,如单选按钮或菜单项,都有一个本机代码“对等”控件,即平台提供的组件。有一组并行的 java 类及其对应的 C 类。特别有趣的是 java Graphics 类,它允许自定义绘制线条、矩形等。它在 Windows 下与 CDC(设备上下文)对等 - 大概。

Swing中,大多数平台组件都是模拟的,即重新创建自己:绘图、鼠标处理等。所以本机部分更简单,比如可能是带有自定义绘图的 CWnd(窗口组件)。

Swing 可以实现更一致且功能更丰富的功能。您可以想象在 AWT 单选按钮上设置背景颜色可能是不可能的,或者在标签或工具提示上使用 HTML 是不可能的。Swing 还可以做蒙皮、主题、LookAndFeels。系统的外观和感觉是对平台组件的密切模仿。特别是 Swing 组件的重量更轻,因为并非每个组件都有一个本地对等控件以在 C 中处理。

现在SWT是后来 IBM 在 eclipse 中实现的用于重新加载 AWT 的倡议。不像 Swing 那样可定制,但打算靠近平台。

您应该忘记使用 AWT 组件,如果不为 Eclipse RCP 编程,也应该忘记使用 SWT。

因此:鼠标点击、重绘请求等全局平台事件被转换为 Java 事件。有 JFrame、JPanels、JScrollPanes、JComponents 的容器层次结构。一个事件被分派给处理组件,例如调用paintComponent:

@Override
public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g; // A later introduced class that can do more.
    g2.draw...
}

JavaFX带来了一个新的播放器,恕我直言,它尚未完全成熟,但可用于非生产代码。它启用效果/动画、旋转、变换、灯光。因此,基于类似平台渲染的 2D - 4D 渲染。它也是基于属性的,因此复选框不一定绑定到布尔值,而是布尔属性观察和通知更改。我还需要一些实践经验,才能用它来构思一个最佳架构。

于 2013-05-08T13:39:20.540 回答
3

如果您对 java 的实现方式感到好奇,您应该查看源代码。http://openjdk.java.net/projects/jdk7/将是一个开始。

当然,这只会让您深入了解该特定实现,并不意味着您的 java 以相同的方式实现。

于 2013-05-08T12:40:13.040 回答
2

一个盒子是如何出现在屏幕上的?此功能由操作系统提供给 JVM(由 Linux 上的 X Window 系统提供)。

在 Java 级别上,JFrame 继承自 java.awt.Window,它具有本地窗口系统提供的“本地对等点” 。

如果您真的想了解它,最好尝试仅使用 C 创建一些窗口。

于 2013-05-08T13:24:00.470 回答