1、SWING界面设计n概述n用户界面n组件介绍n布局管理n事件处理n菜单和表格n了解AWT和Swingn熟悉4个顶层容器n掌握JFramen熟悉常用的中间容器n会对组件进行布局n熟悉常用基本组件的创建和操作n会设置组件的颜色和字体n会处理组件上发生的事件n会创建菜单和表格n用户界面的类型字符用户界面(CUI):例如,MS-DOS图形用户界面(GUI):例如,Microsoft WindowsnGUI的组件基本的控制组件,基本的控制组件,例如:例如:Button、Label等等。容器:容器:能容纳和排列组件的组件能容纳和排列组件的组件组件组件组件继承它的父容器的性质MenuList BoxChec
2、k BoxRadio ButtonButtonLabel Frame WindowText BoxCombo BoxnAWTAWT(Abstract Window Toolkit)是在Swing出现之前用来设计界面的工具包用awt包中的类创建的用户界面在不同的操作平台上有不同的表现。使用不灵活import java.awt.*;nSwingSwing是对AWT的扩展,它是Java 2中的一个标准包n组件都以J开头,例如:JFrame、JButton等。swing界面在不同的平台上外观完全一样,真正做到平台独立nimport javax.swing.*;java.lang.Objectjava.
3、awt.Componentjava.awt.Containerjava.awt.Paneljava.awt.Windowjava.applet.AppletJAppletjavax.swing.JComponentjava.awt.Dialogjava.awt.FrameJDialogJFrameJWindowSwing组件组件n 一个顶层容器(即主窗口)n 顶层容器包含若干个中间容器n 每个中间容器包含若干个基本组件n 按照合理的布局方式将它们组织在一起n 基本组件可响应发生在其上的事件n容器 容器是用来容纳和管理一组界面元素的对象。基本组件必须被安排在某个容器中,否则就无法使用。JFram
4、eContainerJWindowJPanelJDialogJApplet有边框容器无边框容器n JFrame , JApplet , JDialog , JWindow 作用:创建初始界面,为其他组件提供一个容器,以构建满足用户需求的操作界面n JFrame用来创建application,最常用的n JApplet用来创建appletn JDialog用来创建对话框,常用n JWindow不常用n JPanel , JScrollPane , JSplitPane , JTabbedPane、JInternalFrame、Box 这些容器提供将有关组件按照某种布局组合在一起,然后放入中间容器
5、或顶层容器的功能n JPanel提供一个面板n JScrollPane是具有滚动条的窗格n JSplitPane是具有拆分功能的窗格n JTabbedPane是带有若干标签的分类窗格n JInternalFrame用于创建内嵌于JFrame中的内部框架n Box提供创建横向/纵向盒子容器的功能nJLabelnJButton、JCheckBox、JRadioButtonnJList、JComboBoxnJTextField、JPasswordField、JTextAreanJToolBar、JToolTip、JProgressBarnJSlider、JSpinnernJFileChooser、J
6、ColorChoosernJMenuBar、JMenu、JMenuItem、JCheckBoxMenuItem、JRadioButtonMenuItem、JPopupMenunJTablenJTreenJOptionPane、JSeparatorn类 JFrame 是java.awt.Frame的子类n在Swing的组件中, JFrame 并不全是由Java编写的是一种与平台关系比较密切的组件(Heavyweight component)java.lang.Object | +-java.awt.Component | +-java.awt.Container | +-java.awt.Win
7、dow | +-java.awt.Frame | +-javax.swing.JFrame构造方法JFrame() 创建无标题窗口。JFrame(String s) 创建标题名字是字符串s的窗口。例如:JFrame f = new JFrame(“Hello”);常用方法setTitle(String title) 设置JFrame标题文本get/ setSize():获取/设置JFrame的大小。add(Object a):将组件添加到JFrame中。dispose()关闭JFrame并回收用于创建窗口的任何资源。setVisible(boolean b)设置JFrame的可见性。setLo
8、cation(x,y) 设置JFrame在屏幕的位置n常用方法void setExtendedState(int);/设置扩展的状态,取值: NORMAL ICONIFIED MAXIMIZED_HORIZ MAXIMIZED_VERT MAXIMIZED_BOTH /最大化void setDefaultCloseOperation(int);/设置默认的关闭时的操作,取值: DO_NOTHING_ON_CLOSE HIDE_ON_CLOSE DISPOSE_ON_CLOSE EXIT_ON_CLOSE /关闭 import javax.swing.*; public class FirstJ
9、Frame public static void main(String args) JFrame f = new JFrame(); f.setTitle(My First JFrame); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(300, 300); f.setVisible(true); import javax.swing.*; public class SecondJFrame extends JFrame public SecondJFrame() super(“My Second JFrame”);
10、setDefaultCloseOperation(EXIT_ON_CLOSE); setExtendedState(MAXIMIZED_BOTH); setVisible(true); public static void main(String args) SecondJFrame f = new SecondJFrame(); n相关类n创建图标和图像对象n设置setIconImage(image);n由JFrame创建初始的用户界面n由JPanel、JScrollPane、JTabbedPane、JSplitPane、JInternalFrame、Box等创建中间容器n由基本组件类创建有
11、关的组件n将基本组件按照某种布局添加到中间容器中,根据需要可能会用到容器的嵌套n将中间容器按照某种布局添加到顶层容器中,形成满足用户需求的操作界面Container con = getContentPane();JPanel panel = new JPanel();JButton butt = new JButton(Press Me);panel.add(butt);con.add(panel);n学生基本信息录入界面的设计设计一个用户界面,用于输入学生的下列信息: 姓名JTextField密码 JPasswordField 性别JRadioButton 党否 JCheckBox 年龄JS
12、pinner颜色 JColorChooser 加分JSlider系别 JComboBox 选课JList确认 JButton 保存JFileChooser 结果 JTextArea要求输入完毕按“确认”将该学生的信息记录到“结果”中;按“保存”将结果保存到一个指定的文件中;基本信息与结果界面上下分布在一个JSplitPane中;屏幕下方显示当前时间步骤一:由JFrame创建初始的用户界面,获得JFrame的容器,添加中间容器JPanelJFrame f=new JFrame();f.setTitle(学生信息管理系统学生信息管理系统);f.setDefaultCloseOperation(JF
13、rame.EXIT_ON_CLOSE);f.setExtendedState(MAXIMIZED_BOTH);/f.setSize(800,600);/f.setLocation(200,200);Container con=f.getContentPane();JPanel pan=new JPanel();con.add(pan);f.setVisible(true);标签 标签(JLabel)是最简单的组件,用于显示单行静态文本。用户只能查看其内容而不能对其进行修改。 标签类没有事件响应。构造方法标签内容一般不需要改变,但也可以使用setText和setIcon方法进行改变例如当使用同一
14、标签显示不同的图片时,就可使用setIcon方法实现步骤二:添加标签(要录入的基本信息的名称)JFrame f=new JFrame();Container con=f.getContentPane();Jpanel pan=new JPanel();JLabel l_xm=new JLabel(姓名姓名);pan.add(l_xm);JLabel l_xb=new JLabel(性别性别);pan.add(l_xb);con.add(pan);f.setVisible(true);n按钮是常用的功能组件,表示按钮的类为JButton。构造方法JButton button1 = new JBu
15、tton(“姓名”);ImageIcon ii = new ImageIcon(“java.gif”);JButton button2 = new JButton(ii);JButton button3 = new JButton(“姓名”,ii);常用方法void setActionCommand(String);void addActionListener(ActionListener);按钮按钮步骤二:添加按钮(确认和保存按钮)JFrame f=new JFrame(); Container con=f.getContentPane();JPanel pan=new JPanel();J
16、Label l_xml_xm=new JLabel(姓名姓名);pan.add(l_xm); JButton b_sub=new JButton(确认确认);pan.add(b_sub);JButton b_save=new JButton(保存保存);pan.add(b_save); con.add(pan);f.setVisible(true);n构造方法构造方法JTextField tf1 = new JTextField(10);JTextField tf2 = new TextField(“aa”);JTextField tf3 = new JTextField(“aa”,8);Co
17、mponentTextComponentJTextFieldJTextArea单行的文本框单行的文本框多行的文本区多行的文本区文本框(文本框(JTextField)n其它方法其它方法 public String getText() public String getSelectedText() public void setText(String s) public void setEchoChar(char c) public void setEditable(boolean b)步骤二:添加文本框(录入姓名信息)JFrame f=new JFrame(); Container con=f.
18、getContentPane();JPanel pan=new JPanel();JLabel l_xm=new JLabel(姓名姓名);pan.add(l_xm);JTextField tf_name=new JTextField(20);pan.add(tf_name);con.add(pan);f.setVisible(true);n构造方法构造方法 JTextArea ta1 = new JTextArea(5,5);JTextArea ta1 = new JTextArea(5,5);JTextArea ta2 = new JTextArea(JTextArea ta2 = new
19、 JTextArea(“abab”,8,7);,8,7);ComponentTextComponentJTextFieldJTextArea单行的文本框单行的文本框多行的文本区多行的文本区文本区(文本区(JTextArea)n其它方法其它方法 public getCaretPosition() public void insert(String str,int pos) public String getSelectedText() public int getSelectionStart() public int getSelectionEnd() public void replaceRa
20、nge(String str,int start,int end) n 应用中经常将文本区对象放入一个滚动窗格中,以使用滚动条功能,方法如下:JTextArea ta = new JTextArea(10,10);JScrollPane sp = new JScrollPane(ta);文本区(文本区(JTextArea)步骤二:添加文本域(显示录入结果信息)JFrame f=new JFrame(); Container con=f.getContentPane();Jpanel pan=new JPanel(); Jlabel l_jg=new JLabel(录入结果录入结果);JText
21、Area result=new JTextArea(10,30);JScrollPane sp=new JScrollPane(result);pan.add(sp); pan.add(l_jg);con.add(pan);f.setVisible(true);单选按钮(单选按钮( JRadioButton )n构造方法(与构造方法(与JButton类似)类似)JRadioButton rbutt1 = new JRadioButton(JRadioButton rbutt1 = new JRadioButton(“男男”, true););ImageIcon ii = new ImageIc
22、on(ImageIcon ii = new ImageIcon(“java.gif”););JRadioButton rbutt2 = new JRadioButton(ii);JRadioButton rbutt2 = new JRadioButton(ii);JRadioButton rbutt3 = new JRadioButton(JRadioButton rbutt3 = new JRadioButton(“女女”,iiii,false);false);n常用方法常用方法void addActionListener(ActionListener);void addActionList
23、ener(ActionListener);void addItemListener(ItemListener);void addItemListener(ItemListener);boolean isSelected();boolean isSelected();void setSelected(boolean);void setSelected(boolean);n使用单选按钮时经常用到ButtonGroup类,如下创建按钮组对象ButtonGroup bg = new ButtonGroup();创建若干单选按钮对象JRadioButton b1 = new JRadioButton(“
24、x”);JRadioButton b2 = new JRadioButton(“y”);将各单选按钮添加到按钮组中bg.add(b1);bg.add(b2);将单选按钮添加到其他容器中容器对象.add(b1);容器对象.add(b2);n注:按钮组维持只有一个单选按钮处于选择状态单选按钮(单选按钮( JRadioButton )步骤二:添加单选按钮(选择性别)JFrame f=new JFrame(); Container con=f.getContentPane();Jpanel pan=new JPanel(); JRadioButton male = new JRadioButton(男
25、男, true);JRadioButton female = new JRadioButton(女女);ButtonGroup group=new ButtonGroup();group.add(male);group.add(female);pan.add(male);pan.add(female); con.add(pan);f.setVisible(true);n构造方法构造方法JCheckbox()JCheckbox()创建一个没有标签的复选框。创建一个没有标签的复选框。JCheckbox( Icon icon)JCheckbox( Icon icon)创建一个有图标的复选框。创建一个
26、有图标的复选框。JCheckbox(Icon icon ,boolean sele ) JCheckbox(Icon icon ,boolean sele ) 创建一个有图标创建一个有图标iconicon的复选的复选框,初始状态为框,初始状态为selsselsJCheckbox( String s)JCheckbox( String s)创建一个有标签的复选框。创建一个有标签的复选框。JCheckbox( String s,boolean b)JCheckbox( String s,boolean b)创建一个有标签的复选框,参数创建一个有标签的复选框,参数b b设设置初始状态置初始状态JCh
27、eckbox(String str ,Icon icon ) JCheckbox(String str ,Icon icon ) 创建一个有创建一个有strstr文字及图标文字及图标iconicon的复选框的复选框JCheckbox(String str,Icon icon,boolean sele) JCheckbox(String str,Icon icon,boolean sele) 创建一个有创建一个有strstr文文字及图标字及图标iconicon的复选框的复选框, ,初始状态为初始状态为selssels复选框(复选框(JCheckbox)n常用方法isSelected():返回复选
28、按钮的状态,返回类型是boolean。如果返回true,则表示该按钮处于选中状态;否则处于未选中状态。setSelected (Boolean state):设置复选按钮的状态。复选框(复选框(JCheckbox)步骤二:添加复选框(选择爱好,多项选择)JFrame f=new JFrame(); Container con=f.getContentPane();Jpanel pan=new JPanel(); Jlabel l_ah=new JLabel(爱好爱好);JCheckBox hobby=new JCheckBox(音乐音乐),new JCheckBox(足球足球),new JCh
29、eckBox(绘画绘画);pan.add(l_ah);pan.add(hobby0);pan.add(hobby1);pan.add(hobby2); con.add(pan);f.setVisible(true);构造方法其它常用方法 void addListSelectionListener();void setVisibleRowCount(int);void setSelectionMode(int);/取值如下(在ListSelectionModel中定义)SINGLE_SELECTIONSINGLE_INTERVAL_SELECTION MULTIPLE_INTERVAL_SELE
30、CTION(默认)int getSelectedIndex();int getSelectedIndices();Object getSelectedValue();Object getSelectedValues();列表框(列表框(JListJList)步骤二:添加列表框(选择选修课程)JFrame f=new JFrame(); Container con=f.getContentPane();Jpanel pan=new JPanel(); JLabel l_xk=new JLabel(选课选课);String coursesNames = 数据结构数据结构“,操作系统操作系统“,网络
31、原理网络原理,Java程序设计程序设计“,分布式系统开发技术分布式系统开发技术,计算机导论计算机导论“,密码学密码学,计算机组成原理计算机组成原理“,编译原理编译原理,图形学图形学”;course = new JList(coursesNames);pan.add(l_xk);pan.add(course);con.add(pan);f.setVisible(true);n 构造方法String ss = “red”,”green”,”blue”;JComboBox cb1 = new JComboBox(ss);JComboBox cb2 = new JComboBox(Vector);n
32、常用方法 addItem() 添加一个项目到 JComboBox. get/setSelectedIndex()获取/设置 JComboBox 中选中项目的索引 get/setSelectedItem()获取/设置选中的对象。 removeAllItems()从 JComboBox 删除所有对象。 removeItem()从 JComboBox 删除特定对象。 setEditable把一个组合框设置为可编辑的。注意编辑只会影响当前项,它不会改变列表的内容。( JComboBox )步骤二:添加下拉列表(选择院系)JFrame f=new JFrame(); Container con=f.ge
33、tContentPane();Jpanel pan=new JPanel(); JLabel l_yx=new JLabel(院系院系);pan.add(l_yx);String departmentNames = 计算机科学与技术系计算机科学与技术系,电子信息与技术系电子信息与技术系,计算机工程系计算机工程系”;JComboBox department = new JComboBox(departmentNames);department.setEditable(false);pan.add(department); con.add(pan);f.setVisible(true);n 构造方
34、法(类似于JTextField)n 常用方法void addActionListener(ActionListener);char getPassword();void setEchoChar(char);char getEchoChar();( JPasswordField )步骤二:添加密码(密码输入显示“*”)JFrame f=new JFrame(); Container con=f.getContentPane();Jpanel pan=new JPanel(); JLabel l_ma=new JLabel(密码密码);pan.add(l_ma);password=new JPas
35、swordField(20);password.setEchoChar(*);pan.add(password); con.add(pan);f.setVisible(true);n 构造方法JSlider slider = new JSlider(JSlider.HORIZONTAL,0,100,10);n 常用方法void addChangeListener(ChangeListener);void setValue(int);int getValue();void setMajorTickSpacing(int);void setMinorTickSpacing(int);void se
36、tPaintTicks(boolean); /falsevoid setPaintLabels(boolean); /falsevoid setPaintTrack(boolean); /truevoid setSnapToTicks(boolean); /false( JSlider )步骤二:添加加分选项(加分的选项采用滑动条实现)JFrame f=new JFrame(); Container con=f.getContentPane();Jpanel pan=new JPanel(); JLabel l_jf=new JLabel(加分加分); pan.add(l_jf);additi
37、on = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);addition.setMajorTickSpacing(10);addition.setMinorTickSpacing(5);addition.setPaintTicks(true);addition.setPaintLabels(true);addition.setSnapToTicks(true);pan.add(addition); con.add(pan);f.setVisible(true);n 构造方法 JProgressBar(int,int,int); JProgressBar
38、 pb = new JProgressBar( JProgressBar. HORIZONTAL, 0,100);n 常用方法void addChangeListener(ChangeListener);void setValue(int); /设置当前值void setString(String);/设置显示的字符串void setStringPainted(boolean);/设置是否显示字符串,默认为falsevoid setBorderPainted(boolean);/设置是否显示边框,默认为true( JProgressBar )步骤二:添加进度条JFrame f=new JFra
39、me(); Container con=f.getContentPane();Jpanel pan=new JPanel(); JProgressBar progbar = new JProgressBar(JProgressBar.HORIZONTAL,0,100);progbar.setStringPainted(true);con.add(pan);f.setVisible(true);n 构造方法JFileChooser fc1,fc2; /声明两个对象变量fc1 = new JFileChooser();/使用系统默认目录fc2 = new JFileChooser(“d:java”
40、);n 显示方法int showOpenDialog(Component);int showSaveDialog(Component);/分别用于显示标准的打开和保存对话框/参数Component指定对话框依附的父组件/返回值:APPROVE_OPTION选择了确认 CANCEL_OPTION选择了取消 ERROR_OPTION出现了错误( JFileChooser ) 其他常用方法void setCurrentDirectory(File);void setMultiSelectionEnabled(boolean);File getSelectedFile();File getSelect
41、edFiles();File getCurrentDirectory();String getName(File);/取得文件/目录名称,不含路径,可用File类的getAbsolutePath()方法获取完整路径void setFileSelectionMode(int);/FILES_ONLY 只能选择文件(默认) DIRECTORIES_ONLY 只能选择目录 FILES_AND_DIRECTORIES 文件和目录都可选void setFileFilter(FileFilter);n 显示方法使用JColorChooser提供的类方法showDialogstatic Color show
42、Dialog( Component, /父组件 String, /标题 Color /初始颜色值 );/返回值:新选择的颜色值Colorn 示例Color c = JColorChooser.showDialog (this,”请选择颜色”,Color.red);/得到颜色对象c后,即可在需要的地方使用(JColorChooser)n Confirm对话框int showConfirmDialog(Component,Object);/显示含有 Yes、No、Cancel 按钮的确认框/参数:父组件,显示信息/返回值: YES_OPTION是 NO_OPTION否 CANCEL_OPTION撤
43、销 OK_OPTION确定 CLOSED_OPTION关闭还有其他形式的类方法,请参阅帮助文档框(框( JOptionPane)n Input对话框String showInputDialog(Component,Object);/参数:父组件,显示信息/返回值: 选择确认后返回 输入的字符串 选择取消或关闭后返回 null还有其他形式的类方法,请参阅帮助文档框(框( JOptionPane)n Message对话框void showMessageDialog(Component,Object);/参数:父组件,显示信息/没有返回值,只是用来显示一些信息还有其他形式的类方法,请参阅帮助文档框(
44、框( JOptionPane)n Option对话框int showOptionDialog( Component, /父组件 Object, /显示信息 String, /标题 int, /标准选项按钮组类型 int, /标准信息图标类型 Icon, /自定义信息图标 Object, /自定义选项按钮组 Object /自定义默认的选项按钮 );/该方法提供了丰富且复杂的表达形式,请参阅帮助文档注:使用这些标准对话框,可以方便实现某些功能框(框( JOptionPane)n 构造方法JSpinner spinner = new JSpinner();n 常用方法void addChangeL
45、istener(ChangeListener);void setValue(Object);Object getValue();Object getNextValue();Object getPreviousValue();JFrame f=new JFrame(); Container con=f.getContentPane();Jpanel pan=new JPanel(); JLabel lb=new JLabel(年龄年龄);JSpinner jsp=new JSpinner();jsp.setValue(new Integer(20);pan.add(lb);pan.add(jsp
46、); con.add(pan);f.setVisible(true);步骤二:添加年龄微调器步骤二:添加年龄微调器n 构造方法Timer(int, ActionListener);Timer timer = new Timer(1000,this);n 常用方法void start();void stop();void restart();void setDelay(int);void setRepeats(boolean);boolean isRunning(); 创建边框(使用BorderFactory类的类方法)Border border1 = /创建一个具有指定颜色和宽度的线边框Bor
47、derFactory.createLineBorder(Color,int);Border border2 = BorderFactory.createTitledBorder(String); 创建一个新标题边框,采用默认设置,并指定了标题文本。Border border3 = BorderFactory. createLoweredBevelBorder();创建一个具有凹入斜面边缘的边框Border border4 = BorderFactory.createRaisedBevelBorder();创建一个具有凸出斜面边缘的边框Border border5 = BorderFactory
48、.createEtchedBevelBorder();创建一个具有“浮雕化”外观效果的边框,将组件的当前背景色用于突出显示和阴影显示 使用setBorder(border)方法设置组件的边框边框(边框(BorderBorder)n分隔线(JSeparator) 构造方法JSeparator separator1 = new JSeparator(); /默认水平JSeparator separator2 = new JSeparator(JSeparator.HORIZONTAL);JSeparator separator3 = new JSeparator(JSeparator.VERTIC
49、AL); 使用add(JSeparator)方法加到合适的地方n设置颜色默认情况下,Java使用RGB颜色描述系统RGB指红/绿/蓝三基色,取值范围是0,255,一种颜色就是这三种基本颜色的组合描述颜色的类是java.awt.Color颜色对象的创建Color c3 = JColorChooser.showDialog(Component,String,Color);n有了Color对象后,可使用setForeground(Color);setBackground(Color);设置组件的前景色和背景色n 字体类:java.awt.Fontn 字体对象的创建Font(String name,i
50、nt style,int size); /名称,如 “隶书” /风格,取值有 PLAIN, BOLD, ITALIC /大小,如 24,60Font f = new Font(“宋体”,Font.BOLD,24);n 设置组件的字体setFont(Font);n 光标类:java.awt.Cursorn 光标对象的获取Cursor.getPredefinedCursor(int); /如:DEFAULT_CURSOR、HAND_CURSOR、WAIT_CURSOR、TEXT_CORSOR、CROSSHAIR_CURSORn 设置组件的光标setCursor(Cursor.HAND_CURSOR