现在我们用java的swing库,当然是直接调用函数,图像就出来了,那么它们到底是如何画出来的呢?比如,我要画一个最基本的东西,最短的语句大概是这样
JFrame j=new JFrame();
j.setSize(200,200);
j.setVisible(true);我翻了翻source,构造函数这一步,都是初始化一些基本信息
protected void frameInit() {
enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK);
setLocale( JComponent.getDefaultLocale() );
setRootPane(createRootPane());
setBackground(UIManager.getColor("control"));
setRootPaneCheckingEnabled(true);
if (JFrame.isDefaultLookAndFeelDecorated()) {
boolean supportsWindowDecorations =
UIManager.getLookAndFeel().getSupportsWindowDecorations();
if (supportsWindowDecorations) {
setUndecorated(true);
getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
}
}
sun.awt.SunToolkit.checkAndSetPolicy(this, true);
}那么关键是setVisible这个函数了?但是源代码是这样写的:
public void setVisible(boolean b) {
show(b);
}
show(b)那一行是被划掉的,就是已过时方法。那现在到底是如何实现的呢?不就看不下去了?那该怎么往下看呢?或者请大家直接告诉我到底是如何画出来的
JFrame j=new JFrame();
j.setSize(200,200);
j.setVisible(true);我翻了翻source,构造函数这一步,都是初始化一些基本信息
protected void frameInit() {
enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK);
setLocale( JComponent.getDefaultLocale() );
setRootPane(createRootPane());
setBackground(UIManager.getColor("control"));
setRootPaneCheckingEnabled(true);
if (JFrame.isDefaultLookAndFeelDecorated()) {
boolean supportsWindowDecorations =
UIManager.getLookAndFeel().getSupportsWindowDecorations();
if (supportsWindowDecorations) {
setUndecorated(true);
getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
}
}
sun.awt.SunToolkit.checkAndSetPolicy(this, true);
}那么关键是setVisible这个函数了?但是源代码是这样写的:
public void setVisible(boolean b) {
show(b);
}
show(b)那一行是被划掉的,就是已过时方法。那现在到底是如何实现的呢?不就看不下去了?那该怎么往下看呢?或者请大家直接告诉我到底是如何画出来的
public void show() {
if (!visible) {
synchronized (getTreeLock()) {
visible = true;
ComponentPeer peer = this.peer;
if (peer != null) {
peer.show(); public final Object getTreeLock() {
return LOCK;
}static final Object LOCK = new AWTTreeLock();static class AWTTreeLock {}就是说,AWTTreeLock是Component的内部类?但是没有什么内容呀如果先不管这个ComponentPeer peer = this.peer;ComponentPeer是接口,那现在这个接口到底是由哪个类实现的?也不得而知
swt是调用本地API
Swing 只为诸如窗口和框架之类的顶层 组件使用对等体。大部分组件(JComponent 及其子类)都是使用纯 Java 代码来模拟的。
Swing直接调用Java2D,抛弃了本地操作系统平台组件的实现,完全自己画出来了整个组件,当然Java2D底层也是调用平台的图形系统。-----------------------------
Apolication -
-
----------------------------- Swing API
Swing -
Implementation -
-
-
-
----------------------------- Java 2D API
Java 2D -
-
-----------------------------当然Swing是建立在AWT基础上的,对于一些顶层容器类如Frame / Dialog / Window以及Applet是直接采用AWT的