1、Java Swing 用户界面设计11.1 Swing 简介11.1.1 简介第五讲中我们学习了 AWT,AWT 是 Swing 的基础。Swing 的产生主要原因就是 AWT 不能满足图形化用户界面发展的需要。AWT 设计的初衷是支持开发小应用程序的简单用户界面。例如 AWT 缺少剪贴板、打印支持、键盘导航等特性,而且原来的 AWT 甚至不包括弹出式菜单或滚动窗格等基本元素。此外 AWT 还存在着严重的缺陷,人们使 AWT 适应基于继承的、具有很大伸缩性的事件模型,基于同位体的体系结构也成为其致命的弱点。随着发展的需要,Swing 出现了,Swing 组件几乎都是轻量组件,与重量组件相比,没
2、有本地的对等组件,不像重量组件要在它们自己的本地不透明窗体中绘制,轻量组件在它们的重量组件的窗口中绘制。这一讲我们讲一下基本的 Swing 组件使用方法和使用 Swing 组件创建用户界面的初步方法。 Swing 是由 100%纯 Java 实现的,Swing 组件是用 Java 实现的轻量级( light-weight)组件,没有本地代码,不依赖操作系统的支持,这是它与 AWT组件的最大区别。由于 AWT 组件通过与具体平台相关的对等类(Peer)实现,因此 Swing 比 AWT 组件具有更强的实用性。Swing 在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。Swin
3、g 采用了一种 MVC 的设计范式,即“模型-视图-控制“(Model-View-Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。Swing 外观感觉采用可插入的外观感觉(Pluggable Look and Feel,PL /引入 Swing 包名/import com.sun.java.swing.*; /使用 JDK 1.2 Beta 4 版和所有 Swing 1.1 Beta 3/之前的版本,引入 Swing 包名用此方法。import java.awt.*;import java.awt.event.*;public class SwingAp
4、plication private static String labelPrefix = “Number of button clicks: “;private int numClicks = 0; /计数器,计算点击次数public Component createComponents() final JLabel label = new JLabel(labelPrefix + “0 “);JButton button = new JButton(“Im a Swing button!“);button.setMnemonic(KeyEvent.VK_I); /设置按钮的热键为Ibutt
5、on.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) numClicks+;label.setText(labelPrefix + numClicks);/显示按钮被点击的次数);label.setLabelFor(button);/* 在顶层容器及其内容之间放置空间的常用办法是把内容添加到Jpanel 上,而 Jpanel 本身没有边框的。*/JPanel pane = new JPanel();pane.setBorder(BorderFactory.createEmptyB
6、order(30, /top30, /left10, /bottom30) /right);pane.setLayout(new GridLayout(0, 1); /单列多行pane.add(button);pane.add(label);return pane;public static void main(String args) try UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName();/设置窗口风格 catch (Exception e) /创建顶层容器并添加内容.JFrame fram
7、e = new JFrame(“SwingApplication“);SwingApplication app = new SwingApplication();Component contents = app.createComponents();frame.getContentPane().add(contents, BorderLayout.CENTER);/窗口设置结束,开始显示frame.addWindowListener(new WindowAdapter() /匿名类用于注册监听器public void windowClosing(WindowEvent e) System.ex
8、it(0););frame.pack();frame.setVisible(true);查看运行结果 11.1.9 Swing 程序结构简介Swing 的程序设计一般可按照下列流程进行:1 引入 Swing 包2 选择“外观和感觉“3 设置顶层容器4 设置按钮和标签5 向容器中添加组件6 在组件周围添加边界11. 进行事件处理例子 11.1 说明了 Swing 中程序设计的结构以及最基本的组件 Button 和Label 的用法。在程序中,我们建立一个 Swing 风格的窗口,并在其中添加一个按钮,程序中保存一个计数器以计算按钮被点击的次数,并在每一次点击之后用一个 Label 显示。在这个程
9、序中我们可以看到 Swing 组件的使用与 AWT 组件的使用基本方法一致,使用的事件处理机制也完全相同。这些在前面的 AWT中已经讲过,不再赘述。11.2 Swing 组件和容器在 Swing 中不但用轻量级的组件替代了 AWT 中的重量级的组件,而且Swing 的替代组件中都包含有一些其他的特性。例如,Swing 的按钮和标签可显示图标和文本,而 AWT 的按钮和标签只能显示文本。Swing 中的大多数组件都是 AWT 组件名前面加了一个“J“。11.2.1 组件的分类Jcomponent 是一个抽象类,用于定义所有子类组件的一般方法,其类层次结构如下所示: java.lang.Objec
10、t|+-java.awt.Component|+-java.awt.Container|+-javax.swing.JComponent并不是所有的 Swing 组件都继承于 JComponent 类,JComponent 类继承于Container 类,所以凡是此类的组件都可作为容器使用。组件从功能上分可分为:1) 顶层容器:JFrame,JApplet,JDialog,JWindow 共 4 个2) 中间容器:JPanel,JScrollPane,JSplitPane,JToolBar 3) 特殊容器:在 GUI 上起特殊作用的中间层,如JInternalFrame,JLayeredPan
11、e,JRootPane.4) 基本控件:实现人际交互的组件,如 Jbutton, JComboBox, JList, JMenu, JSlider, JtextField。5) 不可编辑信息的显示:向用户显示不可编辑信息的组件,例如 JLabel, JProgressBar, ToolTip。6) 可编辑信息的显示:向用户显示能被编辑的格式化信息的组件,如JColorChooser, JFileChoose, JFileChooser, Jtable, JtextArea。JComponent 类的特殊功能又分为:1) 边框设置:使用 setBorder()方法可以设置组件外围的边框,使用一个
12、EmptyBorder 对象能在组件周围留出空白。2) 双缓冲区:使用双缓冲技术能改进频繁变化的组件的显示效果。与 AWT组件不同,JComponent 组件默认双缓冲区,不必自己重写代码。如果想关闭双缓冲区,可以在组件上施加 setDoubleBuffered(false)方法。3) 提示信息:使用 setTooltipText()方法,为组件设置对用户有帮助的提示信息。4) 键盘导航:使用 registerKeyboardAction( ) 方法,能使用户用键盘代替鼠标来驱动组件。JComponent 类的子类 AbstractButton 还提供了便利的方法用 setMnemonic(
13、)方法指明一个字符,通过这个字符和一个当前 L/把其它组件添加到 Jpanel 中;frame.setContentPane(contentPane); /把 contentPane 对象设置成为 frame 的内容面板11.2.3 各种容器面板和组件看图 根面板由一个玻璃面板(glassPane)、一个内容面板(contentPane)和一个可选择的菜单条(JMenuBar)组成,而内容面板和可选择的菜单条放在同一分层。玻璃面板是完全透明的,缺省值为不可见,为接收鼠标事件和在所有组件上绘图提供方便。根面板提供的方法:Container getContentPane(); /获得内容面板set
14、ContentPane(Container); /设置内容面JMenuBar getMenuBar( ); /活动菜单条setMenuBar(JMenuBar); /设置菜单条JLayeredPane getLayeredPane(); /获得分层面板setLayeredPane(JLayeredPane); /设置分层面板Component getGlassPane(); /获得玻璃面板setGlassPane(Component); /设置玻璃面板11.2.3.2 分层面板(JLayeredPane)Swing 提供两种分层面板:JlayeredPane 和 JDesktopPane。 JDesktopPane 是 JLayeredPane 的子类,专门为容纳内部框架(JInternalFrame)而设置。向一个分层面板种添加组件,需要说明将其加入哪一层,指明组件在该层中的位置:add(Component c, Integer Layer, int position)。