JFrame是如何工作的?它在深层内部是如何绘制的?

8

通常,当我创建一个类时,比如 Customer ,我会给它一些数据字段,例如 public int IdNumber; 和一些方法,例如 public String getName(){...}。但那就是全部了。我无法超越那个限制并开始操作图形——我只能在类允许的范围内操作和组织数据。

我无法理解JFrame内部发生了什么。写JFrame类的人,他们是如何编写一个可以在屏幕上显示一个框的类呢?内部到底发生了什么导致这种情况发生?有没有办法模拟它?

相同的问题适用于所有基于图形的Java类。每次我使用其中之一时,我都非常好奇它是如何工作的,并且这真的困扰着我。


3
可能接近于“可以写本书,范围太广”,但不管怎样我都很想知道答案。 - Richard Tingle
我认为它使用底层操作系统来显示它们。 - hamid
5
你并不惊讶于所有的网络课程,是吗?这与此相同。虚拟机使用平台上可用的任何本地API。 - Mat
去源头看总是有帮助的:http://www.oracle.com/technetwork/java/architecture-142923.html - Gilbert Le Blanc
2
@RichardTingle 我只是想要一些通俗易懂的解释。比如,如果我对汽车一无所知,并且想知道一个金属盒子如何以60英里每小时的速度移动,能够满足我的好奇心的答案是:“它有一个引擎,它会产生成千上万次微小的爆炸,推动活塞上下运动,进而带动齿轮旋转并驱动车轮。” - CodyBugstein
有用的链接;http://en.wikipedia.org/wiki/Java_Native_Interface - CodyBugstein
3个回答

4

Java起源于AWT(Abstract Windowing Toolkit),后来引入了Swing。

AWT中,平台事件处理循环被挂钩,并将事件打包到自己的Java类中,而一个单一的(非并行)事件处理队列/线程会逐个处理它们。Swing继承了这一点。

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

Swing中,大多数平台组件都是模拟的,即重新创建:绘图、鼠标处理等等。因此,本地部分更简单,例如使用自定义绘图的CWnd(窗口组件)。

Swing可以实现更一致和功能更丰富的功能。您可以想象,在AWT单选按钮上设置背景颜色可能是不可能的,或者在标签或工具提示上使用HTML。同时,Swing可以进行皮肤、主题和外观的设置。 系统外观被视为平台组件的近似拷贝。特别是Swing组件更加轻量级,因为不是每个组件都有一个本机对等控件在C中处理。

现在,SWT是IBM在重载AWT时实现的后期举措,在Eclipse中实现。它没有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渲染也可以实现。它还是基于属性的,所以复选框不必绑定到布尔值,而是绑定到观察并通知更改的布尔属性。我仍然需要一些实践经验,以设计出最佳架构。


3
如果你对Java的实现方式感到好奇,你可以查看源代码。从http://openjdk.java.net/projects/jdk7/开始浏览。

当然,这只能让你了解特定实现的情况,不能说明你的Java是以同样的方式实现的。


我没有具体查看它的位置,但是http://openjdk.java.net/groups/swing/ Swing和AWT在那里,并且还有一个简短的描述。 - Devolus

2
一个框在屏幕上如何出现?这个功能由操作系统提供给JVM(在Linux上由X Window System提供)。
在Java级别上,JFrame继承自java.awt.Window,它有由本地窗口系统提供的“本机对等体”。
如果你真的想理解它,最好尝试只使用C创建一些窗口。

我在哪里可以获取更多关于最后一部分的信息? - CodyBugstein
这在每个操作系统上都有所不同。在Linux上,“xlib”是最基本的库(其他库都建立在此之上)。在Windows上,“Win32 API”(或“Win64 API”)是基本库。 - lbalazscs
同样地,OS X 使用 Quartz - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接