通常,当我创建一个类时,例如Customer
,我会给它一些数据字段,即public int IdNumber;
和一些方法,即public String getName(){...}
。但这就是它。我不能超越它并开始玩图形 - 我只能在类允许的情况下操纵和组织数据。
我无法理解JFrame中发生的事情。谁写了JFrame类,他们是怎么写一个可以让一个盒子出现在屏幕上的类?内部会发生什么导致这种情况发生?无论如何都要效仿吗?
同样的问题适用于所有基于图形的Java类。我真的很想知道它是如何工作的,因为每次我使用其中一个都会困扰我。
答案 0 :(得分:3)
如果您对如何实现java感到好奇,那么您应该查看源代码。 http://openjdk.java.net/projects/jdk7/将是一个开始。
当然,这只会让您深入了解该特定实现,并不意味着您的java以相同的方式实现。
答案 1 :(得分:3)
Java以 awt (抽象窗口工具包)开始,后来引入了 swing 。
在 AWT 中,平台事件处理循环被挂钩,事件被打包在自己的java类中,一个(非并行)事件处理队列/线程一个接一个地处理它们。 Swing继承了这个。
在 AWT 中,每个GUI组件(如单选按钮或菜单项)都具有本机代码“peer”控件,即平台提供的组件。有一组并行的java类和它们的C对应物。特别有趣的是java Graphics类,它允许自定义绘制线条,矩形等。它在Windows下与CDC(设备上下文)对等 - 大概是。
在 Swing 中,大多数平台组件都是模拟的,即自己重新创建:绘图,鼠标处理等。因此原生部分更简单,例如可能是带有自定义绘图的CWnd(Window组件)。
Swing可以实现更一致且功能更丰富的功能。您可以想象在AWT单选按钮上设置背景颜色可能是不可能的,或者在标签或工具提示上使用HTML。 Swing也可以做皮肤,主题,LookAndFeels。 System 的外观和感觉是对平台组件的近似模仿。 特别是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渲染,基于类似平台渲染。它也是基于属性的,因此复选框不一定会绑定到布尔值,而是一个布尔属性,用于观察和通知更改。 我还需要一些实践经验,用它来构思最佳架构。
答案 2 :(得分:2)
如何在屏幕上显示框?操作系统将此功能提供给JVM(通过Linux上的X Window系统)。
在Java级别,JFrame继承自java.awt.Window,它具有本机windowing system提供的“本地对等”。
如果您真的想了解它,最好只尝试使用C创建一些窗口。