java - JFrame 是如何工作的?在内心深处,它是如何画东西的?

标签 java swing jframe awt graphics2d

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

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

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

最佳答案

Java 始于 awt(抽象窗口工具包),后来引入了 swing

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

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

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

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

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

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

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

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

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

关于java - JFrame 是如何工作的?在内心深处,它是如何画东西的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16440713/

相关文章:

java - JFrame中的图像显示

java - JButton 不产生输出 - 石头剪刀布游戏(GUI,Java)

java - 是否可以在 Swing 中自定义主 JFrame 标题呈现?

Java多态/抽象类帮助

java - 使用open smpp 3.4发送短信

java - 复选框树未按预期工作

Java KeyListener 没有在 JSpinner 上触发

java - 为什么我的 JFrame 没有出现在基于 Web 的 Java 应用程序中?

java - Android 权限。INTERACT_ACROSS_USERS 拒绝

java - 使用 JSCH (android) 将 ssh 日志打印到列表