java心得--Swing
1. Swing是建立在AWT基础上的一种“增强型”的GUI组件库,其中使用轻量组件代替了AWT中绝大部分的重量组件,并提供了AWT所缺少的一些附加组件和观感控制组件,可以更好的体现平台无关性。
2. 重量组件通过委托操作系统对应组件(指底层平台,如Windows操作系统的用户界面组件)来完成具体工作,包括组件的绘制和事件响应等。AWT的组件均为重量组件,或者说AWT的组件只是对本地组件的封装。重量组件的缺陷是开销大、效率低,每一个组件都要调用底层平台功能单独绘制;且由于受到所在底层平台对组件的限制,具有严重平台相关性,其显示效果在不同平台上很难一直。、
3. 轻量组件则不存在本地对应组件,是通过java绘图技术在其所在容器窗口中绘图而得到,由于是画出来的。因此可以实现组件的“透明”效果,并能够做到不同平台上的一直效果表现,且组件绘制和事件处理开销要小得多,进而提高了程序运行效率。
4. 由于轻量组件必须在自己的窗口中绘制最终还是要包含在一个重量容器中,因此Swing组件中的几个顶层容器,如:JFrame、JDialog和JApplet还是采用了重量组件其余的均为轻量组件。从使用效果上一般看不出重量组件和轻量组件的不同,但实际开发中出顶层容器只能是重量组件外,不建议轻、重量组件混合使用,或者说不提倡AWT/Swing混用,这可能会导致不兼容的问题,甚至出现意想不到的后果。
5. 需要强调的是,Swing是基于AWT的,所有Swing组件类均继承了AWT中的容器类java.awt.Container,因此其关系是利用而非取代。相对来说,Swing组件结构复杂、效果更丰富、功能更强,但在不强调图形界面用户的小规模、快速应用开发中。使用AWT来实现会更便捷。
6. Component类组件是除了几个顶级容器(JFrame、JDialog)之外的所有Swing组件的父类,其中添加了数量众多的方法以实现增强的组件特性。
7. 7.JFrame继承扩充了java.awt.Frame类,其结构要比Frame复杂的多。简单的说JFrame不再是一个单一的容器,而是由相互间存在包含关系的多个不同的容器面板(JRootPane、GrassPane、LayerePane和ContentPane)组成,我们实际上只使用其中的内容面板CountentPane,即将组件加入其内容面板中,对其他的底层结构不必太在意。、
8. 和Frame另一个不同是,JFrame实现了java.swing.WindowConstants接口,该接口定义了用于控制窗口操作的整型常量。主要包括:
DO_NOTHING_ON_ALOSE:默认窗口关闭操作为“无操作”,即单击窗口的“关闭”按钮时不进行任何操作。
HIDE_ON_ALOSE:默认窗口关闭操作为“隐藏窗口”,即单击窗口的“关闭”按钮时隐藏当前窗口。
DISPOSE_ON_ALOSE:默认窗口关闭操作为“销毁操作”,即单击窗口的“关闭”按钮时释放由此窗口及其包含的子组件所使用的所有本机屏幕资源,即这些Component的资源将被破坏,他们使用的所有内存都将返回到操作系统,并将他们标记为不可显示。随后还可以调用setVisible(true)方法重新构造本机资源,并再次显示窗口及其组件。需要的话,我们也可以在程序中调用顶级窗口组件java.awt.Window类中的dispose()方法人工释放其屏幕资源。
EXIT_ON_ALOSE:默认窗口关闭操作为“退出程序”,即单击窗口的“关闭”按钮时退出当前程序。
9. JFrame中的Swing类中的标签(JLable)组件默认显示效果是透明的,可以调用setOpaque(true)方法设置其不透明性。
10. JButton与Button的功能基本相同,但可以实现跟复杂的显示效果,如:可以使用图片作为按钮标签、可以方便的在JButton上设置快捷键(用setMnemonic()方法设置)和添加工具提示信息等。setToolTipText()方法的功能是注册要在组件的工具提示中显示的文本。
11. 定时器
Javax.swing.Tinmer类提供了定时器功能,用于在指定的时间延迟之后触发ActionEvent事件,以执行所需的处理逻辑。在监听器的处理方法actionPerformed()中应已事先给出要延时执行任务代码,然后调用Timer的start()方法启动定时器即可。
可以在创建Timer对象时指定延迟时间,计时单位为毫秒。在默认情况下,定时器将重复工作,即以指定的延迟时间为间隔循环进行事件触发操作。如果希望计时器只动作一次,则可调用Timer对象的setRepeated(false)方法,此外,还可使用setInitialDelay()方法单独设置首次延迟的时间;之后的定时器可以调用stop()方法停止运行,即不再定时触发事件,然后可以再调用restart()方法恢复其运行。