• 1. 张蕾 zhanglei@ujn.edu.cn界面设计
  • 2. 概述 用户界面 组件介绍 布局管理 事件处理 菜单和表格 主要内容
  • 3. 本章基本要求了解AWT和Swing 熟悉4个顶层容器 掌握JFrame 熟悉常用的中间容器 会对组件进行布局 熟悉常用基本组件的创建和操作 会设置组件的颜色和字体 会处理组件上发生的事件 会创建菜单和表格
  • 4. 用户界面的类型 字符用户界面(CUI):例如,MS-DOS 图形用户界面(GUI):例如,Microsoft Windows GUI的组件 基本的控制组件,例如:Button、Label等。容器:能容纳和排列组件的组件组件用户界面概述组件继承它的父容器的性质
  • 5. MenuList BoxCheck BoxRadio ButtonButtonLabel Frame WindowText BoxCombo Box
  • 6. AWT AWT(Abstract Window Toolkit)是在Swing出现之前用来设计界面的工具包 用awt包中的类创建的用户界面在不同的操作平台上有不同的表现。使用不灵活 import java.awt.*; Swing Swing是对AWT的扩展,它是Java 2中的一个标准包 组件都以J开头,例如:JFrame、JButton等。swing界面在不同的平台上外观完全一样,真正做到平台独立 import javax.swing.*;基本概述
  • 7. 界面设计中常用组件类的体系结构java.lang.Objectjava.awt.Componentjava.awt.Containerjava.awt.Paneljava.awt.Windowjava.applet.AppletJAppletjavax.swing.JComponentjava.awt.Dialogjava.awt.FrameJDialogJFrameJWindowSwing组件
  • 8. 用户界面
  • 9. 一个顶层容器(即主窗口) 顶层容器包含若干个中间容器 每个中间容器包含若干个基本组件 按照合理的布局方式将它们组织在一起 基本组件可响应发生在其上的事件Java程序界面的构成
  • 10. 容器 容器是用来容纳和管理一组界面元素的对象。基本组件必须被安排在某个容器中,否则就无法使用。 JFrameContainerJWindowJPanelJDialogJApplet有边框容器无边框容器顶层容器
  • 11. 顶层容器JFrame , JApplet , JDialog , JWindow 作用:创建初始界面,为其他组件提供一个容器,以构建满足用户需求的操作界面 JFrame用来创建application,最常用的 JApplet用来创建applet JDialog用来创建对话框,常用 JWindow不常用
  • 12. JPanel , JScrollPane , JSplitPane , JTabbedPane、JInternalFrame、Box 这些容器提供将有关组件按照某种布局组合在一起,然后放入中间容器或顶层容器的功能 JPanel提供一个面板 JScrollPane是具有滚动条的窗格 JSplitPane是具有拆分功能的窗格 JTabbedPane是带有若干标签的分类窗格 JInternalFrame用于创建内嵌于JFrame中的内部框架 Box提供创建横向/纵向盒子容器的功能中间容器
  • 13. JLabel JButton、JCheckBox、JRadioButton JList、JComboBox JTextField、JPasswordField、JTextArea JToolBar、JToolTip、JProgressBar JSlider、JSpinner JFileChooser、JColorChooser JMenuBar、JMenu、JMenuItem、JCheckBoxMenuItem、JRadioButtonMenuItem、JPopupMenu JTable JTree JOptionPane、JSeparator基本组件
  • 14. 类 JFrame 是java.awt.Frame的子类 在Swing的组件中, JFrame 并不全是由Java编写的 是一种与平台关系比较密切的组件(Heavyweight component) java.lang.Object | +--java.awt.Component | +--java.awt.Container | +--java.awt.Window | +--java.awt.Frame | +--javax.swing.JFrame 创建用户主窗口--JFrame
  • 15. 构造方法 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的可见性。 setLocation(x,y) 设置JFrame在屏幕的位置创建用户主窗口--JFrame
  • 16. 常用方法 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 //关闭 创建用户主窗口--JFrame
  • 17. import javax.swing.*; public class FirstJFrame { 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); }} 示例:直接使用JFrame创建
  • 18. import javax.swing.*; public class SecondJFrame extends JFrame { public SecondJFrame() { super(“My Second JFrame”); setDefaultCloseOperation(EXIT_ON_CLOSE); setExtendedState(MAXIMIZED_BOTH); setVisible(true); } public static void main(String[] args) { SecondJFrame f = new SecondJFrame(); }} 示例:扩展JFrame创建
  • 19. 相关类 图标类:javax.swing.ImageIcon 图像类:java.awt.Image 创建图标和图像对象 ImageIcon ii = new ImageIcon(“x.gif”); Image image = ii.getImage(); 设置 setIconImage(image); 设置JFrame的图标
  • 20. 由JFrame创建初始的用户界面 由JPanel、JScrollPane、JTabbedPane、JSplitPane、JInternalFrame、Box等创建中间容器 由基本组件类创建有关的组件 将基本组件按照某种布局添加到中间容器中,根据需要可能会用到容器的嵌套 将中间容器按照某种布局添加到顶层容器中,形成满足用户需求的操作界面界面的基本组织方式
  • 21. Container con = getContentPane(); JPanel panel = new JPanel(); JButton butt = new JButton("Press Me"); panel.add(butt); con.add(panel); 获得JFrame的容器并添加组件
  • 22. 学生基本信息录入界面的设计 设计一个用户界面,用于输入学生的下列信息: 姓名 JTextField 密码 JPasswordField 性别 JRadioButton 党否 JCheckBox 年龄 JSpinner 颜色 JColorChooser 加分 JSlider 系别 JComboBox 选课 JList 确认 JButton 保存 JFileChooser 结果 JTextArea 要求输入完毕按“确认”将该学生的信息记录到“结果”中;按“保存”将结果保存到一个指定的文件中;基本信息与结果界面上下分布在一个JSplitPane中;屏幕下方显示当前时间示例:学生信息管理系统
  • 23. 步骤一:由JFrame创建初始的用户界面,获得JFrame的容器,添加中间容器JPanel 示例:学生信息管理系统 JFrame f=new JFrame(); f.setTitle("学生信息管理系统"); f.setDefaultCloseOperation(JFrame.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);
  • 24. 基本组件
  • 25. 标签 标签(JLabel)是最简单的组件,用于显示单行静态文本。用户只能查看其内容而不能对其进行修改。 标签类没有事件响应。 构造方法 JLabel label1 = new JLabel(“姓名”); ImageIcon ii = new ImageIcon(“java.gif”); JLabel label2 = new JLabel(ii); JLabel label3 = new JLabel(“姓名”,ii,JLabel.CENTER); 标签内容一般不需要改变,但也可以使用setText和setIcon方法进行改变 例如当使用同一标签显示不同的图片时,就可使用setIcon方法实现 基本组件—标签
  • 26. 步骤二:添加标签(要录入的基本信息的名称) 示例:学生信息管理系统 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);
  • 27. 按钮是常用的功能组件,表示按钮的类为JButton。 构造方法 JButton button1 = new JButton(“姓名”); ImageIcon ii = new ImageIcon(“java.gif”); JButton button2 = new JButton(ii); JButton button3 = new JButton(“姓名”,ii); 常用方法 void setActionCommand(String); void addActionListener(ActionListener); 基本组件—按钮
  • 28. 步骤二:添加按钮(确认和保存按钮) 示例:学生信息管理系统 JFrame f=new JFrame(); …… Container con=f.getContentPane(); JPanel pan=new JPanel(); JLabel 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);
  • 29. 构造方法 JTextField tf1 = new JTextField(10); JTextField tf2 = new TextField(“aa”); JTextField tf3 = new JTextField(“aa”,8);ComponentTextComponentJTextFieldJTextArea单行的文本框多行的文本区基本组件—文本框(JTextField) 其它方法 public String getText() public String getSelectedText() public void setText(String s) public void setEchoChar(char c) public void setEditable(boolean b)
  • 30. 步骤二:添加文本框(录入姓名信息) 示例:学生信息管理系统 JFrame f=new JFrame(); …… Container con=f.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);
  • 31. 构造方法 JTextArea ta1 = new JTextArea(5,5); JTextArea ta2 = new JTextArea(“ab”,8,7);ComponentTextComponentJTextFieldJTextArea单行的文本框多行的文本区基本组件—文本区(JTextArea) 其它方法 public getCaretPosition() public void insert(String str,int pos) public String getSelectedText() public int getSelectionStart() public int getSelectionEnd() public void replaceRange(String str,int start,int end)
  • 32. 应用中经常将文本区对象放入一个滚动窗格中,以使用滚动条功能,方法如下: JTextArea ta = new JTextArea(10,10); JScrollPane sp = new JScrollPane(ta); 基本组件—文本区(JTextArea)
  • 33. 步骤二:添加文本域(显示录入结果信息) 示例:学生信息管理系统 JFrame f=new JFrame(); …… Container con=f.getContentPane(); Jpanel pan=new JPanel(); …… Jlabel l_jg=new JLabel("录入结果"); JTextArea result=new JTextArea(10,30); JScrollPane sp=new JScrollPane(result); pan.add(sp); pan.add(l_jg); …… con.add(pan); f.setVisible(true);
  • 34. 基本组件—单选按钮( JRadioButton ) 构造方法(与JButton类似) JRadioButton rbutt1 = new JRadioButton(“男”, true); ImageIcon ii = new ImageIcon(“java.gif”); JRadioButton rbutt2 = new JRadioButton(ii); JRadioButton rbutt3 = new JRadioButton(“女”,ii,false); 常用方法 void addActionListener(ActionListener); void addItemListener(ItemListener); boolean isSelected(); void setSelected(boolean);
  • 35. 使用单选按钮时经常用到ButtonGroup类,如下 创建按钮组对象 ButtonGroup bg = new ButtonGroup(); 创建若干单选按钮对象 JRadioButton b1 = new JRadioButton(“x”); JRadioButton b2 = new JRadioButton(“y”); 将各单选按钮添加到按钮组中 bg.add(b1); bg.add(b2); 将单选按钮添加到其他容器中 容器对象.add(b1); 容器对象.add(b2); 注:按钮组维持只有一个单选按钮处于选择状态基本组件—单选按钮( JRadioButton )
  • 36. 步骤二:添加单选按钮(选择性别) 示例:学生信息管理系统 JFrame f=new JFrame(); …… Container con=f.getContentPane(); Jpanel pan=new JPanel(); …… JRadioButton male = new JRadioButton("男", 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);
  • 37. 构造方法 JCheckbox()创建一个没有标签的复选框。 JCheckbox( Icon icon)创建一个有图标的复选框。 JCheckbox(Icon icon ,boolean sele ) 创建一个有图标icon的复选框,初始状态为sels JCheckbox( String s)创建一个有标签的复选框。 JCheckbox( String s,boolean b)创建一个有标签的复选框,参数b设置初始状态 JCheckbox(String str ,Icon icon ) 创建一个有str文字及图标icon的复选框 JCheckbox(String str,Icon icon,boolean sele) 创建一个有str文字及图标icon的复选框,初始状态为sels 基本组件—复选框(JCheckbox)
  • 38. 常用方法 isSelected():返回复选按钮的状态,返回类型是boolean。如果返回true,则表示该按钮处于选中状态;否则处于未选中状态。 setSelected (Boolean state):设置复选按钮的状态。 基本组件—复选框(JCheckbox)
  • 39. 步骤二:添加复选框(选择爱好,多项选择) 示例:学生信息管理系统 JFrame f=new JFrame(); …… Container con=f.getContentPane(); Jpanel pan=new JPanel(); …… Jlabel l_ah=new JLabel("爱好"); JCheckBox[] hobby={new JCheckBox("音乐"),new JCheckBox("足球"),new JCheckBox("绘画")}; pan.add(l_ah); pan.add(hobby[0]); pan.add(hobby[1]); pan.add(hobby[2]); …… con.add(pan); f.setVisible(true);
  • 40. 构造方法 String ss[] = {“red”,”green”,”blue”}; JList list1 = new JList(ss); JList list2 = new JList(Vector); 其它常用方法 void addListSelectionListener(…); void setVisibleRowCount(int); void setSelectionMode(int); //取值如下(在ListSelectionModel中定义) SINGLE_SELECTION SINGLE_INTERVAL_SELECTION MULTIPLE_INTERVAL_SELECTION(默认) int getSelectedIndex(); int[] getSelectedIndices(); Object getSelectedValue(); Object[] getSelectedValues(); 基本组件—列表框(JList)
  • 41. 步骤二:添加列表框(选择选修课程) 示例:学生信息管理系统 JFrame f=new JFrame(); …… Container con=f.getContentPane(); Jpanel pan=new JPanel(); …… JLabel l_xk=new JLabel("选课"); String[] coursesNames = {"数据结构“,"操作系统“,"网络原理", "Java程序设计“,"分布式系统开发技术", "计算机导论“,"密码学", "计算机组成原理“,"编译原理", "图形学”}; course = new JList(coursesNames); pan.add(l_xk); pan.add(course); …… con.add(pan); f.setVisible(true);
  • 42. 构造方法 String ss[] = {“red”,”green”,”blue”}; JComboBox cb1 = new JComboBox(ss); JComboBox cb2 = new JComboBox(Vector); 常用方法 addItem() 添加一个项目到 JComboBox. get/setSelectedIndex()获取/设置 JComboBox 中选中项目的索引 get/setSelectedItem()获取/设置选中的对象。 removeAllItems()从 JComboBox 删除所有对象。 removeItem()从 JComboBox 删除特定对象。 setEditable把一个组合框设置为可编辑的。 注意编辑只会影响当前项,它不会改变列表的内容。 基本组件—下拉列表( JComboBox )
  • 43. 步骤二:添加下拉列表(选择院系) 示例:学生信息管理系统 JFrame f=new JFrame(); …… Container con=f.getContentPane(); 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);
  • 44. 构造方法(类似于JTextField) 常用方法 void addActionListener(ActionListener); char[] getPassword(); void setEchoChar(char); char getEchoChar(); 基本组件—密码域( JPasswordField )
  • 45. 步骤二:添加密码(密码输入显示“*”) 示例:学生信息管理系统 JFrame f=new JFrame(); …… Container con=f.getContentPane(); Jpanel pan=new JPanel(); …… JLabel l_ma=new JLabel("密码"); pan.add(l_ma); password=new JPasswordField(20); password.setEchoChar('*'); pan.add(password); …… con.add(pan); f.setVisible(true);
  • 46. 构造方法 JSlider slider = new JSlider(JSlider.HORIZONTAL,0,100,10); 常用方法 void addChangeListener(ChangeListener); void setValue(int); int getValue(); void setMajorTickSpacing(int); void setMinorTickSpacing(int); void setPaintTicks(boolean); //false void setPaintLabels(boolean); //false void setPaintTrack(boolean); //true void setSnapToTicks(boolean); //false 基本组件—滑动条( JSlider )
  • 47. 步骤二:添加加分选项(加分的选项采用滑动条实现) 示例:学生信息管理系统 JFrame f=new JFrame(); …… Container con=f.getContentPane(); Jpanel pan=new JPanel(); …… JLabel l_jf=new JLabel("加分"); pan.add(l_jf); addition = 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);
  • 48. 构造方法 JProgressBar(int,int,int); JProgressBar pb = new JProgressBar( JProgressBar. HORIZONTAL, 0,100); 常用方法 void addChangeListener(ChangeListener); void setValue(int); //设置当前值 void setString(String); //设置显示的字符串 void setStringPainted(boolean); //设置是否显示字符串,默认为false void setBorderPainted(boolean); //设置是否显示边框,默认为true 基本组件—进度条( JProgressBar )
  • 49. 步骤二:添加进度条 示例:学生信息管理系统 JFrame f=new JFrame(); …… 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);
  • 50. 构造方法 JFileChooser fc1,fc2; //声明两个对象变量 fc1 = new JFileChooser();//使用系统默认目录 fc2 = new JFileChooser(“d:\\java”); 显示方法 int showOpenDialog(Component); int showSaveDialog(Component); //分别用于显示标准的打开和保存对话框 //参数Component指定对话框依附的父组件 //返回值:APPROVE_OPTION 选择了确认 CANCEL_OPTION 选择了取消 ERROR_OPTION 出现了错误 基本组件—文件选择器( JFileChooser )
  • 51. 其他常用方法 void setCurrentDirectory(File); void setMultiSelectionEnabled(boolean); File getSelectedFile(); File[] getSelectedFiles(); File getCurrentDirectory(); String getName(File); //取得文件/目录名称,不含路径,可用File类的getAbsolutePath()方法获取完整路径 void setFileSelectionMode(int); //FILES_ONLY 只能选择文件(默认) DIRECTORIES_ONLY 只能选择目录 FILES_AND_DIRECTORIES 文件和目录都可选 void setFileFilter(FileFilter);
  • 52. 显示方法 使用JColorChooser提供的类方法showDialog static Color showDialog( Component, //父组件 String, //标题 Color //初始颜色值 ); //返回值:新选择的颜色值Color 示例 Color c = JColorChooser.showDialog (this,”请选择颜色”,Color.red); //得到颜色对象c后,即可在需要的地方使用 基本组件—颜色选择器(JColorChooser)
  • 53. Confirm对话框 int showConfirmDialog(Component,Object); //显示含有 Yes、No、Cancel 按钮的确认框 //参数:父组件,显示信息 //返回值: YES_OPTION 是 NO_OPTION 否 CANCEL_OPTION 撤销 OK_OPTION 确定 CLOSED_OPTION 关闭 还有其他形式的类方法,请参阅帮助文档基本组件—对话框( JOptionPane)
  • 54. Input对话框 String showInputDialog(Component,Object); //参数:父组件,显示信息 //返回值: ·选择确认后返回 输入的字符串 ·选择取消或关闭后返回 null 还有其他形式的类方法,请参阅帮助文档基本组件—对话框( JOptionPane)
  • 55. Message对话框 void showMessageDialog(Component,Object); //参数:父组件,显示信息 //没有返回值,只是用来显示一些信息 还有其他形式的类方法,请参阅帮助文档基本组件—对话框( JOptionPane)
  • 56. Option对话框 int showOptionDialog( Component, //父组件 Object, //显示信息 String, //标题 int, //标准选项按钮组类型 int, //标准信息图标类型 Icon, //自定义信息图标 Object[], //自定义选项按钮组 Object //自定义默认的选项按钮 ); //该方法提供了丰富且复杂的表达形式,请参阅帮助文档 注:使用这些标准对话框,可以方便实现某些功能基本组件—对话框( JOptionPane)
  • 57. 微调器(JSpinner) 构造方法 JSpinner spinner = new JSpinner(); 常用方法 void addChangeListener(ChangeListener); void setValue(Object); Object getValue(); Object getNextValue(); Object getPreviousValue();
  • 58. 示例:学生信息管理系统 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); …… con.add(pan); f.setVisible(true);步骤二:添加年龄微调器
  • 59. 计时器(Timer) 构造方法 Timer(int, ActionListener); Timer timer = new Timer(1000,this); 常用方法 void start(); void stop(); void restart(); void setDelay(int); void setRepeats(boolean); boolean isRunning();
  • 60. 创建边框(使用BorderFactory类的类方法) Border border1 = //创建一个具有指定颜色和宽度的线边框BorderFactory.createLineBorder(Color,int); Border border2 = BorderFactory.createTitledBorder(String);  创建一个新标题边框,采用默认设置,并指定了标题文本。 Border border3 = BorderFactory. createLoweredBevelBorder(); 创建一个具有凹入斜面边缘的边框 Border border4 = BorderFactory.createRaisedBevelBorder(); 创建一个具有凸出斜面边缘的边框 Border border5 = BorderFactory.createEtchedBevelBorder(); 创建一个具有“浮雕化”外观效果的边框,将组件的当前背景色用于突出显示和阴影显示 使用setBorder(border)方法设置组件的边框 组件的边框设置边框(Border)
  • 61. 分隔线(JSeparator) 构造方法 JSeparator separator1 = new JSeparator(); //默认水平 JSeparator separator2 = new JSeparator(JSeparator.HORIZONTAL); JSeparator separator3 = new JSeparator(JSeparator.VERTICAL); 使用add(JSeparator)方法加到合适的地方 组件的分隔线设置
  • 62. 设置颜色 默认情况下,Java使用RGB颜色描述系统 RGB指红/绿/蓝三基色,取值范围是[0,255],一种颜色就是这三种基本颜色的组合 描述颜色的类是java.awt.Color 颜色对象的创建 Color c = new Color(0,255,0); 直接使用Color类中定义的标准颜色常量 如 Color.BLACK 或 Color.black 等 Color c1 = Color.BLACK; //Color.black C)颜色选择器JColorChooser直观得到一个Color对象 Color c3 = JColorChooser.showDialog( Component,String,Color); 组件的颜色设置
  • 63. 有了Color对象后,可使用 setForeground(Color); setBackground(Color); 设置组件的前景色和背景色 组件的颜色设置
  • 64. 字体类:java.awt.Font 字体对象的创建 Font(String name,int style,int size); //名称,如 “隶书” //风格,取值有 PLAIN, BOLD, ITALIC //大小,如 24,60 Font f = new Font(“宋体”,Font.BOLD,24); 设置组件的字体 setFont(Font);组件的字体设置
  • 65. 光标类:java.awt.Cursor 光标对象的获取 Cursor.getPredefinedCursor(int); //如:DEFAULT_CURSOR、HAND_CURSOR、WAIT_CURSOR、TEXT_CORSOR、CROSSHAIR_CURSOR 设置组件的光标 setCursor(Cursor.HAND_CURSOR); 组件的光标设置
  • 66. JPanel 创建对象 JPanel p = new JPanel(); 默认布局为FlowLayout,可以改变,如 p.setLayout(new GridLayout(2,3)); 添加组件 p.add(组件对象1); p.add(组件对象2); …… 中间容器的使用
  • 67. JScrollPane JTextArea ta = new JTextArea(50,50); JScrollPane sp = new JScrollPane(ta); JSplitPane JTextArea ta = new JTextArea(50,50); JPanel p = new JPanel(); JSplitPane sp = new JSplitPane (JSplitPane. HORIZONTAL_SPLIT,ta,p); //另一种方式 JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,ta,p); 中间容器的使用
  • 68. JTabbedPane JTabbedPane tp = new JTabbedPane(); tp.setTabPlacement(int); tp.addChangeListener(ChangeListener); JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); tp.addTab(“p1”,p1); tp.addTab(“p2”,p2); tp.removeTabAt(0); int n = tp.getTabCount(); 中间容器的使用
  • 69. JInternalFrame 示例:ExampleCh07_Jframe.java中class JInternalFrame_test中间容器的使用
  • 70. Java用户图形界面设计步骤 根据需要往界面中添加组件 通过布局管理器对容器中的组件进行组织排列 如何相应用户对组件的操作,即事件处理小结
  • 71. 布局管理
  • 72. 布局是指组件在容器中的排列方式,主要有: FlowLayout 流式布局 BorderLayout 边界布局 GridLayout 网格布局 CardLayout 卡片布局 BoxLayout 盒式布局 GridBagLayout 网格包布局 null 空布局(不使用布局) 注:对于一些复杂的情况,往往需要使用容器的嵌套,各容器可使用不同的布局。当容器的尺寸改变时,布局管理器会自动调整组件的排列布局的概念
  • 73. 该布局以行为单位依次排列各组件,一行排不下时,另起一行 JPanel的默认布局是FlowLayout 构造方法 FlowLayout(); FlowLayout(int align); //align一般取值有:CENTER、LEFT、RIGHT FlowLayout(int align,int hgap,int vgap); //hgap和vgap指定组件与容器起始边界以及组件间的水平和垂直间距,默认值为5个像素 例如:FlowLayout layout = new FlowLayout(FlowLayout.LEFT, 10, 10); FlowLayout
  • 74. 创建FlowLayout布局对象 FlowLayout l = new FlowLayout(); 创建容器对象 JPanel panel = new JPanel(); 设置容器对象的布局或使用默认布局 panel.setLayout(l); 向容器中添加组件对象(设组件对象已创建) panel.add(组件对象); FlowLayout布局的使用
  • 75. 例如,setLayout(new FlowLayout(FlowLayout.LEFT, 10, 20)); 缺点:当用户对由FlowLayout布局管理的区域进行缩放时,布局发生变化。该布局适用于组件个数较少的情况。FlowLayout布局的使用
  • 76. 按照东、西、南、北、中5个方位排列各组件 顶层容器JFrame、JApplet、JDialog、JWindow的默认布局都是BorderLayout BorderLayout
  • 77. 构造方法 BorderLayout(); BorderLayout(int hgap,int vgap); //hgap和vgap指定组件间的水平和垂直间距,默认值为0个像素 例如:BorderLayout lay1 = new BorderLayout(); BorderLayout lay2 = new BorderLayout(10, 10); BorderLayout
  • 78. 创建BorderLayout布局对象 BorderLayout l = new BorderLayout(); 创建容器对象 JPanel panel = new JPanel(); 设置容器对象的布局或使用默认布局 panel.setLayout(l); 向容器中添加组件对象(设组件对象已创建) panel.add(组件对象,方位); //方位的取值为: BorderLayout.EAST 或 “East” BorderLayout.WEST 或 “West” BorderLayout.SOUTH 或 “South” BorderLayout.NORTH 或 “North” BorderLayout.CENTER 或 “Center”(默认)BorderLayout布局的使用
  • 79. 缺点:当加入的组件超过5个时,就必须使用容器的嵌套或其它布局。 优点:当容器缩放时,组件相应的位置不变化,但大小改变。示例: 边界布局示例BorderLayout布局的使用
  • 80. 按照二维网格以相同大小依次排列各组件 构造方法 GridLayout();//一行、每个组件一列 GridLayout(int rows,int cols);//行列数 GridLayout(rows,cols,int hgap,int vgap); //行行、列列的间距,默认值为0个像素 例如:GridLayout lay1 = new GridLayout(3,3); GridLayout lay2 = new GridLayout(5,2,10,10); GridLayout
  • 81. 创建GridLayout布局对象 GridLayout l = new GridLayout(2,2); 创建容器对象 JPanel panel = new JPanel(); 设置容器对象的布局或使用默认布局 panel.setLayout(l); 向容器中添加组件对象(设组件对象已创建) panel.add(组件对象); 布局的使用
  • 82. 该布局适用于组件个数较多的情况。优点:组件的相应位置不随区域的缩放而改变,只是组件的大小改变。GridLayout
  • 83. 从网格出发来布局组件,但一个组件在横向和纵向上都可以占据多个网格,灵活但比较复杂 使用GridBagConstraints指定组件在布局时的有关约束值 GridBagLayout
  • 84. 属性(11个) gridx,gridy–位置 gridwidth,gridheight–占据网格数 anchor–方位 fill–充满方式 javax.awt.GridBagConstraints.HORIZONTAL javax.awt.GridBagConstraints.VERTICAL javax.awt.GridBagConstraints.BOTH 创建对象 GridBagConstraints gbc1,gbc2; gbc1 = new GridBagConstraints(); gbc2 = new GridBagConstraints(…); GridBagConstraints
  • 85. GridBagLayout gbl = new GridBagLayout(); JPanel panel = new JPanel(); panel.setLayout(gbl); GridBagConstraints gbc = new GridBagConstraints(); …… //设置 JButton button = new JButton("Button"); panel.add(button, gbc); 布局的使用
  • 86. 画出组件布局草图 确定每个组件应占据的网格 分别在x和y方向上为网格标上序号 组件的gridx,gridy,gridwidth,gridheight 据填充和对齐要求设置fill和anchor值 须保持默认大小的组件的weightx和weighty值设为0,其余的设为100 看是否需要设置填塞值insets和ipadx、ipady 编写代码 运行程序,观察结果,必要时进行修改 一般布局步骤
  • 87. 该布局以一叠卡片的形式依次排列各组件 构造方法 CardLayout(); CardLayout(int hgap,int vgap); //组件与容器边界间距,默认值为0个像素 例如: CardLayout layout1 = new CardLayout(); CardLayout layout2 = new CardLayout(10,10); CardLayout
  • 88. 创建CardLayout布局对象 CardLayout l = new CardLayout(); 创建容器对象 JPanel panel = new JPanel(); 设置容器对象的布局或使用默认布局 panel.setLayout(l); 向容器中添加组件对象(设组件对象已创建) panel.add(组件对象,“名称”); 显示组件 l.show(panel,“名称”); l.first(panel); l.last(panel); l.next(panel); l.previous(panel); 布局的使用
  • 89. 以一行或一列的方式依次排列各组件 容器Box的默认布局为且只能为BoxLayout 在实际应用中,常使用Box的有关方法实现布局 javax.swing.Box类的使用 创建Box对象 Box b1 = Box.createHorizontalBox();  创建一个从左到右显示其组件的 Box Box b2 = Box.createVerticalBox();  创建一个从上到下显示其组件的 Box 向盒子中添加组件对象(设组件对象已创建) b1.add(组件对象);BoxLayout
  • 90. 添加Glue: Glue用来对组件进行挤压,产生左对齐、右对齐或两端对齐的效果 b1.add(Box.createHorizontalGlue()); b2.add(Box.createVerticalGlue()); 添加Strut: Strut用来加入组件间的间距 b1.add(Box.createHorizontalStrut(5)); b2.add(Box.createVerticalStrut(5)); 添加RigidArea: RigidArea用来设置组件的间距和高度(宽度和间距) Dimension d = new Dimension(50,80); b1.add(Box.createRigidArea(d)); b2.add(Box.createRigidArea(d)); 向盒子中添加必要的透明组件
  • 91. 不使用任何布局管理器,一般不使用该方式 空布局的使用 创建容器对象 JPanel panel = new JPanel(); 设置容器对象的布局为null panel.setLayout(null); 设置组件在容器中的位置 组件对象.setBounds(x, y, width, height); 向容器中添加组件对象(设组件对象已创建) panel.add(组件对象); NULL
  • 92. 如实现以下界面,可以采用哪些布局管理方式:布局管理器的选择
  • 93. 事件处理
  • 94. 事件处理机制 事件:Java语言将每一个键盘或鼠标的操作定义为一个“事件”。click me!当用户点击了一个按钮,意味着一个按钮事件的发生。事件响应:当事件发生时程序应该作出何种响应。事件处理方法对该事件进行响应 事件处理概述
  • 95. 事件处理的模型 事件源:产生事件的组件叫事件源。 事件对象:描述系统中发生了什么的对象 事件监听器:对事件进行处理的类。事件对象事件监听器事件源事件处理概述
  • 96. Java有20多个预定义的事件类,它们包含了所有组件上可能发生的事件。每一个事件都有一个相应的事件接口,事件接口中的事件处理方法完成对事件的处理。事件处理概述java.util.EventObjectjava.awt.AWTEventComponentEventAdjustmentEventItemEventActionEventTextEventFocusEventContainerEvent InputEventPaintEventWindowEventKeyEventMouseEvent
  • 97. 事件源 事件对象 事件监听器 事件处理回顾创建一个实现了某个监听器接口的类
  • 98. 常见的事件及其监听器一览表事件名称监听器主要用途WindowEventWindowListener窗口发生变化,如关闭ActionEventActionListener产生动作,如单击按钮ItemEventItemListener项目变化,如复选框ListSelectionEventListSelectionListener选择列表中的项目时ChangeEventChangeListener状态改变,如进度条FocusEventFocusListener焦点获得或失去MouseEventMouseListener鼠标点击、进入或离开MouseEventMouseMotionListener鼠标拖动或移动KeyEventKeyListener按键产生时MenuEventMenuListener菜单选择时
  • 99. 创建将要产生事件的组件对象 构造实现相应事件监听器接口的类,并创建事件监听器对象 为组件对象增加事件监听器对象: 组件对象.addXxxListener(事件监听器对象); 如:button.addActionListener(this); 注:接口中的方法都含有所产生的事件对象参数,使用该参数的getSource()方法可以得到产生该事件的事件源 例如: public void actionPerformed(ActionEvent evt);事件处理一般方法
  • 100. ActionEvent 与 ActionListener 当单击按钮、在文本域中回车、选择组合框中的项目、选择菜单项时产生该事件 ActionListener接口中的方法 void actionPerformed(ActionEvent); 该事件在实际应用中经常被处理 ActionEvent中的常用方法 String getActionCommand(); //获得与该动作相联系的组件的命令字符串名称,组件对象可使用 setActionCommand(String) 方法进行设置,默认的命令字符串名称是组件的标签名称 //使用该方法可实现不同组件共用同一段处理代码事件处理
  • 101. public class MyActionListener extends JFrame implements ActionListener { private JButton button; public MyActionListener() { button = new JButton(“开始”); button.addActionListener(this); } public void actionPerformed(ActionEvent evt) { if (evt.getSource() == button) {//(evt.getActionCommand().equals(“开始”)) System.out.println(“Start…”); } } }事件处理示例
  • 102. 示例在文本框中输入英文单词并回车,在另外一个文本框中立刻显示汉语意思(TextFieldAction.java)
  • 103. 1、创建一个主窗口,显示一个按钮,当点击该按钮时,在标题栏中显示当前的时间(DispTime.java) JFrame JButton Timer ActionListener Date SimpleDateFormat 2、点击按钮,在文本框中显示点击次数。 ActionTest.java 示例
  • 104. ItemEvent 与 ItemListener 当单选按钮、复选按钮、下拉列表框中的项目状态发生变化时产生该事件 ItemListener接口中的方法 void itemStateChanged(ActionEvent); ItemEvent中的常用方法 Object getItem(); //返回受该事件影响的项目对象,据需要可将Object转换为相应的类型 int getStateChange(); //返回项目状态发生变化的类型,取值: ItemEvent.SELECTED ItemEvent.DESELECTED事件处理
  • 105. 单选按钮、复选按钮、下拉列表框触发事件 ItemEventTest.java示例
  • 106. WindowEvent 与 WindowListener WindowListener接口中的方法 void windowActivated(WindowEvent); //处理窗口被设置为当前活动窗口时触发的事件 void windowDeactivated(WindowEvent); //处理窗口被设置为非活动窗口时触发的事件 void windowIconified(WindowEvent); //处理窗口最小化时触发的事件 void windowDeiconified(WindowEvent); //处理窗口从最小化变为正常大小时触发的事件 void windowOpened(WindowEvent); //处理窗口第一次显示时触发的事件 void windowClosing(WindowEvent); //处理用户试图关闭窗口时触发的事件 void windowClosed(WindowEvent); //处理窗口被关闭时触发的事件事件处理
  • 107. WindowAdapter适配器 WindowListener接口中含有较多的方法,实现时比较麻烦。为此,Java提供了适配器类WindowAdapter,该类实现了WindowListener接口,可用该类或其子类创建监听器 注:凡含两个以上方法的监听器都有对应的适配器 适配器类实现一个对应的接口,只是方法为空。 public abstract class WindowAdapter implements WindowListener { public void windowOpened(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowClosing(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} } 事件处理
  • 108. 事件适配器类(Adapter) 只实现接口所需要处理的方法通过覆盖 对于接口中的其它方法: 系统会提供默认的方法(方法体为空) 事件适配器类与事件监听器接口的区别? 利用事件适配器类,只需实现所需处理的方法 利用事件监听器接口,必须实现所有的方法 事件适配器类
  • 109. public class MyWindowListener extends JFrame { public MyWindowListner() { JFrame f=new JFrame(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); //setDefaultCloseOperation(EXIT_ON_CLOSE); } //匿名内部类 }事件处理示例
  • 110. ListSelectionEvent与ListSelectionListener 当列表框中的项目发生变化时产生该事件 ListSelectionListener接口中的方法 void valueChanged(ListSelectionEvent); 处理事件时常使用列表框(JList)对象本身提供的一些方法事件处理
  • 111. ChangeEvent 与 ChangeListener 当进度条,滑动条、微调器、标签窗格等组件的状态发生变化时产生该事件 ChangeListener接口中的方法 void stateChanged(ChangeEvent);事件处理
  • 112. FocusEvent 与 FocusListener 当组件获得或失去输入焦点时产生该事件 FocusListener接口中的方法 void focusGained(FocusEvent); void focusLost(FocusEvent); FocusEvent中的常用方法 Component getOppositeComponent(); FocusAdapter适配器事件处理
  • 113. MouseEvent 与 MouseListener 当在组件上进行鼠标基本操作时产生该事件 MouseListener接口中的方法 void mousePressed(MouseEvent); void mouseReleased(MouseEvent); void mouseClicked(MouseEvent); void mouseEntered(MouseEvent); void mouseExited(MouseEvent);事件处理
  • 114. MouseEvent中的常用方法 int getButton(); //NOBUTTON, BUTTON1, BUTTON2, BUTTON3 boolean isAltDown(); boolean isControlDown(); boolean isShiftDown(); int getClickCount(); Point getPoint(); int getX(); int getY(); boolean isPopupTrigger(); //是否是触发弹出式菜单的鼠标操作 MouseAdapter适配器事件处理
  • 115. MouseEvent 与 MouseMotionListener 当在组件上进行鼠标拖动或移动时产生该事件 MouseMotionListener接口中的方法 void mouseDragged(MouseEvent); void mouseMoved(MouseEvent); MouseMotionAdapter适配器 示例 Example07_MouseEventTest.java事件处理
  • 116. KeyEvent 与 KeyListener 当组件上发生击键时产生该事件 KeyListener接口中的方法 void keyPressed(KeyEvent); void keyReleased(KeyEvent); void keyTyped(KeyEvent); KeyEvent中的常用方法 char getKeyChar(); //返回字符键值 int getKeyCode(); //返回整数键值 boolean isAltDown(); boolean isControlDown(); boolean isShiftDown(); 注:KeyEvent中定义了表示键的常量,如 VK_1 KeyAdapter适配器事件处理
  • 117. 菜单和表格
  • 118. 菜单条JMenubar 菜单JMenu 菜单项JMenuItem 菜单项上的事件 菜单事件 菜单的组成菜单菜单分类 下拉式菜单 弹出菜单
  • 119. 创建菜单条(JMenuBar),并将其放在JFrame中 JFrame f=new Jframe(); JMenuBar bar=new JMenuBar(); //创建一个空的菜单条 f.setJMenuBar(bar); 2.创建若干个JMenu对象(JMenu) JMenu menu=new JMenu("文件"); 3.创建若干个JMenuItem对象并将其添加到Jmenu对象中 JMenuItem newf=new JMenuItem("新建"); JMenuItem open=new JMenuItem(“打开”);…… menu.add(newf); menu.add(open); 4.把Jmenu对象添加到JMenuBar对象中 bar.add(menu); 创建菜单的基本步骤
  • 120. 添加分隔线 JMenu menu = new JMenu(“File”); menu.addSeparator(); 给菜单子项定义快捷键 JMenuItem newf=new JMenuItem("新建(N)"); newf.setAccelerator(KeyStroke.getKeyStroke("ctrl N"));其他设定
  • 121. 菜单(JMenu)添加监听器 JMenu对象可添加MenuListener,以处理在点击该菜单时各菜单项的状态 menu.addMenuListener(this); 接口方法有: public void menuSelected(MenuEvent evt); public void menuDeselected(MenuEvent evt); public void menuCanceled(MenuEvent evt); 菜单项(JMenuItem)添加监听器 与按钮事件处理相同 addActionListener(this) actionPerformed(ActionEvent evt) 菜单事件处理
  • 122. 构造方法 JPopupMenu popupMenu = new JPopupMenu(); 采用与普通菜单相同的方法添加内容和监听器 显示快捷菜单 popupMenu.show(Component,int x,int y); //在指定组件的指定位置显示出快捷菜单弹出菜单(JPopupMenu)
  • 123. 使用方法 需要给响应快捷菜单显示的组件添加鼠标监听器 addMouseListener(new MouseAdapter(){ public void mouseReleased(MouseEvent evt){ if (evt.isPopupTrigger()){ popupMenu.show(evt.getComponent(), evt.getX(),evt.getY()); } } });弹出菜单(JPopupMenu)
  • 124. 构造方法 JToolBar toolBar = new JToolBar(); 其他方法 void add(组件对象); void addSeparator(); 为加入的组件添加提示信息 组件对象.setToolTipText(String); 工具条(JToolBar)
  • 125. 菜单和工具条示例 ExampleCh07_MenuTest.java示例
  • 126. 表格是一种以行/列(二维表)形式显示和操作数据的组件,功能强大,常与数据库结合使用 构造方法 JTable(); JTable(int rows,int cols); JTable(Object[][],Object[]); JTable(TableModel); JTable(Vector,Vector);表格(JTable)
  • 127. 创建简单表格 Object[] cols = {“姓名”, “班级”, “成绩”}; Object[][] rows = { {“张三”, “计60”, new Integer(75) }, {“李四”, “网66”, new Integer(85) }, {“王二小”, “电子03”, new Integer(100)} }; JTable table = new JTable(rows,cols); table.setShowGrid(true); table.setGridColor(Color); table.setRowHeight(int);表格(JTable)
  • 128. 使用DefaultTableModel创建表格 Object[] cols = {“姓名”, “班级”, “成绩”}; Object[][] rows = { {“张三”, “计60”, new Integer(75) }, {“李四”, “网66”, new Integer(85) }}; DefaultTableModel model = new DefaultTableModel(rows,cols); JTable table = new JTable(model); model.addColumn(Object); model.addRow(Object[]); model.removeRow(int); model.setValueAt(Object,int row,int col); int rown = model.getRowCount(); int coln = model.getColumnCount(); String colname = model.getColumnNamre(int);表格(JTable)
  • 129. 扩展DefaultTableModel创建表格 class MyModel extends DefaultTableModel{ MyModel(Object[][] data,Object[] column) { super(data,column); } public Class getColumnClass(int c) { return getValueAt(0,c).getClass(); } public boolean isCellEditable(int r,int c) { return false; } //可以覆盖更多的方法 }表格(JTable)
  • 130. 设计一个应用程序,实现下列功能: 主窗口初始显示为最大化 菜单:功能(登录、录入、退出) 登录:显示对话框,输入用户名和密码 录入:输入学生信息,登录后可用 信息:学号、性别、年龄、党否、系别、课程、简历 确认后将记录显示在表格中 退出:询问并确认后退出系统 工具:对应菜单中的退出功能,并设置提示信息 底部设状态条,显示作者、日期、当前时间综合示例
  • 131. AWT与Swing,使用它们时如何倒入相关的类? Swing中的top-level组件有哪些?使用场合如何? Swing中的轻量组件都从那个类继承得到? 如何使用JFrame创建用户界面? 如何创建和使用颜色对象? 如何创建和使用字体对象? FlowLayout如何布局和使用?(排列、间隙) BorderLayout如何布局和使用?(间隙) GridLayout如何布局和使用?(间隙) 本章小结
  • 132. CardLayout如何布局和使用?(间隙) BoxLayout布局及Box容器如何使用? 怎样理解null布局?有什么特点? 各种组件 如何创建和使用菜单(含快捷菜单)? 如何创建工具条和设置工具组件的提示信息? 事件处理的三要素是什么? 如何编写进行事件处理的程序? 你知道的的事件监听器接口有哪些?它们声明了哪些方法?是否有相应的适配器类? 本章小结
  • 133. 作业写出创建应用程序界面的基本框架。 简述Swing图形用户界面事件处理模型及其程序设计模型。 请实现如图所示的功能:初始值为0,当点击“自动加1”按钮时,系统能实现计数器功能,当计到100时,按钮“自动加1”显示“自动减1”,并自动实现减数器功能,如此循环,直到点击退出为止。