• 1. JAVA2 程序设计培训课程
  • 2. 第一讲:Java Swing 组件技术 在本单元您能了解如下知识点: Swing的“外观和感觉” ; Swing容器组件的编程; Swing中的标准对话框; Swing基本组件的编程; Swing的编程具体应用—设计出文本编辑器
  • 3. 一、Java Swing 组件技术简介 Swing 特性: 是AWT的扩展,它比AWT提供了更多的组件和外观。 是Sun公司的新一代的图形界面的标准。 Swing组件的实现不包括任何于平台相关的代码 它是纯Java代码(但Jframe、JDialog、JApplet除外),因此与平台无关。 AWT的缺点: 组件少而且是本地代码实现。 Swing和AWT相比,一个重要改进在于Swing把一个组件的处理分为图形部分和数据部分。 其中图形部分由编程环境统一处理(V) 而数据部分由一个数据处理模型进行处理(M)。
  • 4. Swing组件所在的包: javax.swing 每个组件都以“J” 开头,各个组件都是JComponent的子类。 Swing中的各个组件的事件编程、容器的布局方式仍然与AWT中对应的编程一致,没有改变。
  • 5. Swing编程所应该注意的问题 1、由于Swing中的各个组件类与AWT的组件类有相同的基类,所以可以在同一界面中同时使用Swing与AWT。但有时可能不能正常显示,最好不要合用。 2、正确理解重量组件与轻量组件的不同 轻量组件—Swing组件,由纯Java代码实现,占用系统资源少。 重量组件--AWT组件,由本地C代码实现,占用系统资源多。另外JFrame、JDialog、JApplet也是重量组件。
  • 6. 二、Swing的“外观和感觉”(Look and Feel)1、Swing 提供了三种“外观和感觉”。 Windows系统; Motif X Window系统(UNIX下) Metal(Swing的新的交平台)。 2、意义:通过Look and Feel机制,我们可以使程序的设计者任意转换程序的人机界面来对应不同的操作系统平台。
  • 7. 3、设置方法 (1)静态--设计时设定 (2)动态--运行时设定
  • 8. (1)设计时设定---使用Swing的新的交平台try { UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception exc) { System.err.println("Error loading L&F: " + exc); }
  • 9. (1)设计时设定---使用目标系统平台的外观 (如在Windows系统下为Windows的外观) try { UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() ); } catch (Exception exc) { System.err.println("Error loading L&F: " + exc); }
  • 10. (1)设计时设定---强制为某一种系统平台 原理:加载对应的GUI驱动程序的类。 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); UIManager.setLookAndFeel( "javax.swing.plaf.metal.MetalLookAndFeel");
  • 11. (2)运行时动态地设定1、方法UIManager.setLookAndFeel( “javax.swing.plaf.metal.MetalLookAndFeel” ); SwingUtilities.updateComponentTreeUI(this); //对由this所指示的组件重新设置外观 2、注意:由于JFrame、JApplet等为重量级组件,因此它的外观只与操作系统平台有关系,在相同的操作系统平台下表现出相同的外观。
  • 12. 三、Swing组件的分类JPanel、JScrollPanel、JToolbar JSplitPanel、JTabbedPanel、JLayeredPanel、 JRootPane InternalFrame、顶级容器JFrame、JApplet、JDialog普通功能的容器特殊功能的容器基本组件不可编辑信息显示组件可编辑格式化信息显示组件JButton、JCombobox、JList、JMenu、JSlider、JTextField等JLabel、JProgressBar、JToolTip等JColorChooser、JFileChooser、Jtabel、JTextArea、JTree等
  • 13. 四、在Swing容器中添加组件 对JFrame与JApplet等顶级的容器,在添加组件时与AWT不同点是不能直接调用容器的add()方法。
  • 14. 四、在Swing容器中添加组件(续一) (1)获得当前容器的内容面板对象,利用getContentPane()(其定义为public Container getContentPane()),再调用容器的add()方法来加人各个其它组件; (2)先利用JPanel类生成一个内容面板对象,并将各个组件加入该内容面板对象中,然后再调用setContentPane()方法(其定义为public void setContentPane(Container contentPane))将内容面板对象加入到当前容器中。
  • 15. 2、JFrame 编程(1)它为Frame的升级,代表应用程序的主窗口。 (2)编程的基本方法为: 创建JFrame类的子类; 在自己的子类的构造函数中调用上层基类的构造函数;设置窗口的大小; 设置在用户关闭窗口时则应该完成什么行为;最后显示出窗口。
  • 16. 示例代码import javax.swing.*; public class JFrameTest extends JFrame { public JFrameTest(String title) { super(title); setSize(400,400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String arg [ ]) { JFrameTest jframe=new JFrameTest(“窗口标题条文字”); } }
  • 17. 3、菜单条式菜单 相关的类: 通过JMenuBar类(利用setJMenuBar()方法加入窗口中) JMenu(级联) JMenuItem(菜单项目) JCheckBoxMenuItem(选择性的菜单项目)、JRadioButtonMenuItem(选择性的菜单项目但为圆点)。 编程要点: 一、产生快捷键 mnuFileNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK); 二、添加分割条   mnuFile.addSeparator();
  • 18. 菜单条式菜单编程要点三、给菜单加上图标 mnuFileNew.setIcon(newImageIcon(".\\images\\new.gif")); 四、给菜单加上助记符 mnuFile.setMnemonic('F'); 五、要使得多个JRadioButtonMenuItem项目产生单选的效果,可以将它们放入一个ButtonGroup组件中;否则为多选效果
  • 19. 4、工具条JToolBar 在Swing中的窗口工具条是由JToolBar来实现,它也是一种容器并按照行或列对组件(它们一般为按钮)进行分组。 缺省时为水平方向但可以使用SwingConstants. HORIZONTAL或者SwingConstants. VERTICAL来设置其方向。 构造函数: JToolBar() 创建出水平方向的工具条(缺省为HORIZONTAL)。 JToolBar(int orientation) 创建出指定方向的工具条。 JToolBar(String name) 创建出指定名称的工具条。 JToolBar(String name, int orientation) 创建出指定方向和名称的工具条。
  • 20. 工具条上的工具按钮的事件编程: 类似于一般的按钮事件编程,可以分别为各个不同的按钮单独进行事件编程。 编程方法: 创建出JToolBar对象 然后采用add(Object)方法将组件(可以为按钮或其它组件)加入到工具条中。 最后再将工具条加入到内容面板中 编程实例:工具条JToolBar
  • 21. 5、标准对话框 Swing中提供了JOptionPane类来实现类似Windows平台下的MessageBox的功能,同样在Java中也有。 利用JOptionPane类中的各个static方法来生成各种标准的对话框,实现显示出信息、提出问题、警告、用户输入参数等功能。这些对话框都是模式对话框。 ConfirmDialog---确认对话框,提出问题,然后由用户自己来确认(按“Yes”或“No”按钮) InputDialog---提示输入文本 MessageDialog---显示信息 OptionDialog—组合其它三个对话框类型。
  • 22. 标准对话框 这四个对话框可以采用showXXXDialog()来显示,如: showConfirmDialog()显示确认对话框 showInputDialog()显示输入文本对话框 showMessageDialog()显示信息对话框 showOptionDialog()显示选择性的对话框。
  • 23. showXXXDialog()方法的参数说明①ParentComponent: 指示对话框的父窗口对象,一般为当前窗口。也可以为null即采用缺省的Frame作为父窗口,此时对话框将设置在屏幕的正中。 ②message: 指示要在对话框内显示的描述性的文字 ③String title: 标题条文字串 ④Component: 在对话框内要显示的组件(如按钮) ⑤Icon: 在对话框内要显示的图标
  • 24. showXXXDialog()方法的参数说明⑥messageType:一般可以为如下的值 ERROR_MESSAGE INFORMATION_MESSAGE WARNING_MESSAGE QUESTION_MESSAGE PLAIN_MESSAGE ⑦ optionType:它决定在对话框的底部所要显示的按钮选项。一般可以为 DEFAULT_OPTION YES_NO_OPTION YES_NO_CANCEL_OPTION OK_CANCEL_OPTION。
  • 25. 显示为MessageDialogJOptionPane.showMessageDialog(null, “在对话框内显示的描述性的文字”, “标题条文字串”, JOptionPane.ERROR_MESSAGE);应用场合:功能完成后的信息提示
  • 26. 显示为ConfirmDialog int Result=JOptionPane.showConfirmDialog(this, "Are You sure to Delete File ?", "File Delete ", JOptionPane.YES_NO_CANCEL_OPTION); if(Result==JOptionPane.YES_OPTION) { }应用场合:讯问并等待用户确认
  • 27. 显示InputDialog --让用户进行输入String inputValue = JOptionPane.showInputDialog( "Please input a value");
  • 28. Object[] possibleValues = { "First", "Second", "Third" }; //用户的选择项目 Object selectedValue = JOptionPane.showInputDialog(null, “请在下 拉列表框内选择一个项目”, "请输入数据", JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); setTitle("您按下了"+(String)selectedValue+"项目"); 显示InputDialog让用户进行选择地输入
  • 29. (本页无文本内容)
  • 30. 显示OptionDialog 该种对话框可以由用户自己来设置各个按钮的个数并返回用户点击各个按钮的序号(从0开始计数) Object[] options = {"确定","取消","帮助"}; int response=JOptionPane.showOptionDialog( this, “这是个选项对话框,用户可以选择自己的按钮的个数”, “选项对话框标题”, JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
  • 31. if(response==0) { this.setTitle("您按下了第OK按钮 "); } else if(response==1) { this.setTitle("您按下了第Cancel按钮 "); }
  • 32. 6、通用对话框 1、文件打开或保存JFileChooser 类
  • 33. 创建代码JFileChooser openFileDialog = new JFileChooser(); openFileDialog.setDialogTitle("请您打开您的文件"); openFileDialog.setCurrentDirectory(new File(currentDir)); int returnResult=openFileDialog.showOpenDialog(this); if(returnResult==JFileChooser.APPROVE_OPTION) //识别是否按下"OK" { fileName=openFileDialog.getSelectedFile().getAbsoluteFile().toString(); }
  • 34. 2、颜色选择对话框 JColorChooser
  • 35. 创建代码JColorChooser fontColorDialog = new JColorChooser(); Color userSelectColor= fontColorDialog.showDialog(this, "请您选择您的文字的颜色",Color.black); if(userSelectColor !=null) { setTitle(userSelectColor.toString()); }
  • 36. 将JColorChooser置于某个容器中 一、方法:创建出JColorChooser类对象并使用ColorSelectionModel接口来管理用户所选择的颜色(利用JColorChooser类中得getSelectionModel()得到ColorSelectionModel接口类的对象,并添加ActionListener事件)。 二、代码: JColorChooser colorChooser = new JColorChooser(); this.add("Center",colorChooser); ColorSelectionModel selectModel = colorChooser.getSelectionModel(); selectModel.addChangeListener(this);
  • 37. 3、AWT中的文件打印对话框
  • 38. 4、AWT中的页面设置对话框
  • 39. 7、用户自定义的对话框编程要点:从JDialog类来派生;利用getContentPane().add(child);添加组件
  • 40. 8、JScrollPane 面板 它主要为其它的控件提供Scroll功能。 在Swing 中与AWT中实现Scroll功能不同,在AWT中是由组件自己来实现,而在Swing 中则是统一由JScrollPane来完成。 即对于需要Scroll要求的组件,必须将它添加到JScrollPane容器中,再将这个JScroolPane容器但代替可Scroll组件而添加到容器中。 构造函数:JScrollPane(Component view, int vsbPolicy, int hsbPolicy) 其中的vsbPolicy和hsbPolicy代表ScrollBar的使用方式,
  • 41. JScrollPane 面板主要有如下六种常量: JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED JScrollPane.VERTICAL_SCROLLBAR_NEVER JScrollPane.VERTICAL_SCROLLBAR_ALWAYS JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED JScrollPane.HORIZONTAL_SCROLLBAR_NEVER JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS 创建的代码如下: JTextArea textBox=new JTextArea(); JScrollPane scroll=new JScrollPane(textBox,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); setContentPane(scroll);
  • 42. JScrollPane
  • 43. 9、选项窗格JTabbedPane特性:它表现为一组文件夹页,每个文件夹都有标题(以Windows系统平台下的TabControl控件为例说明)。 类:采用JTabbedPane类来表示,其内的每个页面为一个JPanel类或者其子类的对象。
  • 44. JTabbedPane类构造函数:public JTabbedPane(int tabPlacement, int tabLayoutPolicy) 其中Tabplacement可以是: JTabbedPane.TOP(表头在上面) JTabbedPane.BOTTOM(表头在下面) JTabbedPane.LEFT(表头在左面) JTabbedPane.RIGHT(表头在右面)。 TablayoutPolicy可以是 JTabbedPane.WRAP_TAB_LAYOUT(表头不产生SCROLL效果) JTabbedPane.SCROLL_TAB_LAYOUT(表头产生SCROLL效果)。 编程方法: 创建出JTabbedPane类的对象; 调用addTab()方法加入一个页面组件; 最后将JTabbedPane类的对象加入到顶级容器的ContentPane中。
  • 45. JTabbedPane的事件编程(1)其内的组件事件编程:在各个页面内的组件的事件是独立的,类似于正常的组件事件编程规则。 (2)编程实例:请见JTabbedPaneTest.java
  • 46. 10、表格控件JTable 功能: 它提供以行和列的方式来显示数据,并且可以拖动列 构造函数: JTable(Object[][] rowData, Object[] columnNames) 编程方法: 创建出JTable对象(可以采用表格中的表头数组和数据数组创建出表格、也可以利用实现TableModel接口的类对象来实现)
  • 47. 11、表格控件JTable的编程步骤创建出JTable对象(可以采用表格中的表头数组和数据数组创建出表格、利用实现TableModel接口的类对象) 再创建出一个JScrollPane对象并指示其ScrollBar的使用策略; 将表格控件加入JScrollPane中; 最后将JScrollPane对象加人到顶级容器的ContentPane中
  • 48. 12、JApplet小程序 编程要点: 它与Applet相兼容,但JApplet将JRootPane 作为它的唯一子容器,而ContentPane 是所有的JApplet的各个内部的对象的容器。即在JApplet中增加子控件应该采用getContentPane().add(child); 缺省的ContentPane的布局方式为BorderLayout。
  • 49. 13、弹出式菜单JPopupMenu编程方法类同于AWT中的PopupMenu。
  • 50. 14、JButton与JToggleButton按钮 创建它们的方式基本是相同的,不同点在于事件的监听上。 对JButton应该监听ActionListener接口 而对JToggleButton则要监听ItemListener接口 从而可以识别是否被按下或者弹取。
  • 51. JButton 编程要点之一一、在JButton上产生Rollover图象变化效果(鼠标光标放在它上面与离开它时会产生不同的图形效果)。 二、代码: Container contentPane = f.getContentPane(); Icon rollover = new ImageIcon(".\\icons\\address1.jpg"); Icon general = new ImageIcon(".\\icons\\address2.jpg"); Icon press = new ImageIcon(".\\icons\\address3.jpg"); JButton b = new JButton(); b.setRolloverEnabled(true); b.setIcon(general); //设置按钮正常状态的图象 b.setRolloverIcon(rollover); //设置指向时的图象 b.setPressedIcon(press); //设置在按下按钮时的图象 contentPane.add(b);
  • 52. JButton 编程要点之二一、设置按钮上的快捷键(Alt + 字母) 二、代码: Container contentPane = f.getContentPane(); JButton b = new JButton("Open new window"); b.setMnemonic('O'); //设置快捷键为“Alt + O” b.addActionListener(this); contentPane.add(b);
  • 53. JButton 编程要点之三一、设置默认的按钮:在设计对话框时,可以设置某个按钮为默认的按钮,当按下Enter键时将自动执行该默认的按钮所提供的功能。 二、方法: 调用JrootPane类中的setDefaultButton()方法来指定某一个按钮为该对话框的默认的按钮。
  • 54. 15、JCheckBox与JRadioButton它们两着在创建的方式上的差别是,JRadioButton应该放入一个组对象中以形成互斥效果。在事件的编程上都是要监听ActionListener接口,从而可以识别是否被按下或者弹取。
  • 55. 编程代码 else if(parm1.getSource()==toolBarItem) { if(toolBarItem.getState()) { toolBarItem.setSelected(truethis.getContentPane().add(mainToolBar,BorderLayout.NORTH); } else { toolBarItem.setSelected(false); this.getContentPane().remove(mainToolBar); } toolBarPopupItem.setSelected(toolBarItem.isSelected()); this.show(); }
  • 56. 16、图像图标 ImageIcon 图像图标:可以为按钮和标签提供图标。在Swing中采用ImageIcon类来表示。 创建方法: ImageIcon icon=new ImageIcon(“image.gif”); JButton ok=new JButton(icon); 注意:如果想在Applet 程序中使用ImageIcon,则由于Applet程序的的安全控制机制的原因。 比如在Java Application中使用了ImageIcon对象,那么可以采用new ImageIcon(String filename) 而在Java Applet程序中则必须用new ImageIcon(URL location)来替换。 因为前一种读的是本地文件,而Applet不允许直接读取客户端的本地文件。
  • 57. 17、Border边框接口一、Border边框接口: 利用它可以设置组件的边框,在Swing中BorderFactory类实现了Border接口。 二、编程方法: 调用组件的setBorder( )方法,然后利用BorderFactory类中的static方法创建出某一种类型的边框。 三、代码: JButton OkButton=new JButton(“OK”); OkButton.setBorder(BorderFactory.createLineBorder(Color.blue,10)); 创建出线型边框
  • 58. 18、JTextField 、JPasswordFieldJTextField 、JPasswordField(为JTextField的子类,可以通过setEchoChar(char)来设置隐藏的字符)与JtextArea:基本上类似于AWT。 JLabel:可以包含文字或图像。基本上类似于AWT。 JScrollBar:基本上类似于AWT。
  • 59. 19、JTextArea、JEditorPane、JTextPaneJTextArea:基本上类似于AWT中的TextArea,调用setLineWrap()方法能够让文字自动换行。 JEditorPane:它支持三种不同的文件格式内容,纯文本(text/plain)、RTF格式(text/rtf)、HTML格式(text/html),从而可以利用它来制作HTML格式的在线帮助。 JTextPane:其子类JTextPane能够提供更多的功能,如增加文字的颜色、插入图片、字体缩放、文字风格等更多的排版功能。
  • 60. 20、JComboBox组合框JComboBox组合框与下拉列表框:调用setEditable(true)方法来设置其可编辑状态,则为组合框,否则为下拉列表框。
  • 61. 21、进程条JProgressBar 主要的方法: setMinimum(m_min); setMaximum(m_max); setStringPainted(true); setValue(int n)
  • 62. 22、JSlider 滑动块
  • 63. 23、Timer定时器 在javax.swing包中有一个Timer类,可以实现定时器的功能。 构造函数Timer(int delay, ActionListener listener)。利用Timer定时器,可以周期性地产生ActionEvent事件。 因此要实现该行为,必须实现ActionListener接口并重写actionPerformed()。 javax.swing.Timer myTimer=new javax.swing.Timer(1000,this); myTimer.start();
  • 64. 本讲的回顾