《图形用户界面编程.ppt》由会员分享,可在线阅读,更多相关《图形用户界面编程.ppt(144页珍藏版)》请在三一办公上搜索。
1、,第九章 图形用户界面编程,计算机网络与多媒体研究所计算机科学与技术、软件学院浙江工业大学,高家全 Cell:Email:,前言,本章的目的:图形用户界面(GUI)程序包括哪些元素?如何开发图形用户界面程序?如何让界面上的按钮、下拉框、树等响应鼠标、键盘等?,回顾关键词:字节流(InputStreamOutputStream)、字符流(ReaderWriter)、File、对象序列化()、java中的字符编码(UnicodeUTF-8UTF-16),小节安排,图形用户界面编程,9.3、菜单和工具条,9.5、组件常用方法,9.1、AWT与Swing,9.2、容器:JFrameJPanelJScr
2、ollPaneJSplitPane,9.6、布局管理器,9.7、事件处理模型,9.4、基本组件:JLabelJButtonJComboBoxJTree等,9.8、鼠标事件处理,9.9、事件适配器类,9.10、键盘事件处理,、AWT和Swing,AWT(Abstract Windowing Toolkit)是Java早期(JDK1.0)的GUI标准API 重量级组件在90年代,程序员中流传着一个笑话:Java的真正信条是一次编写,到处测试(Write Once,Test Everywhere)。导致这种糟糕局面的一个可能原因据说是AWT从概念产生到完成实现只用了一个月。,import;impor
3、t;public class TestAWT extends Framepublic TestAWT(String str)super(str);public static void main(String args)TestAWT fr=new TestAWT(Hello AWT Frame!);/设置Frame的大小,缺省为(0,0)fr.setSize(400,300);/设置Frame的背景为红色fr.setBackground(Color.red);/设置Frame为可见,缺省为不可见fr.setVisible(true);,、AWT和Swing,Java 1.2开始,AWT被Swi
4、ng替代 Swing包含的组件的平台相关性较小,所以称为轻量级组件所在的包:javax.swing 由100%纯java实现的,、AWT和Swing,、AWT和Swing,小节安排,图形用户界面编程,9.3、菜单和工具条,9.5、组件常用方法,9.1、AWT与Swing,9.2、容器:JFrameJPanelJScrollPaneJSplitPane,9.6、布局管理器,9.7、事件处理模型,9.4、基本组件:JLabelJButtonJComboBoxJTree等,9.8、鼠标事件处理,9.9、事件适配器类,9.10、键盘事件处理,、JFrame,、JFrame,/*我的第一个java窗口程
5、序,采用直接在main中创建窗口的方法*/import.*;import javax.swing.*;public class TestJFrameDirect,声明实例变量或类变量,定义实例方法或类方法,定义实例方法或类方法,、JFrame,/*我的第一个java窗口程序,采用直接在main中创建窗口的方法*/import.*;import javax.swing.*;public class TestJFrameDirect/*/以下为成员变量(对象)的定义/定义菜单static JMenuBar mb=new JMenuBar();/菜单栏static FgMenu mFile=new
6、FgMenu(文件(F),KeyEvent.VK_F);/文件菜单static JMenuItem miNew=new JMenuItem(新建(N),KeyEvent.VK_N),miOpen=new JMenuItem(打开(O).,KeyEvent.VK_O),miSave=new JMenuItem(保存(S),KeyEvent.VK_S),miFont=new JMenuItem(字体与颜色(F).,KeyEvent.VK_F),miQuit=new JMenuItem(退出(X),KeyEvent.VK_X);/*,、JFrame,import,JMenuBar mb/定义变量(菜
7、单)部分,public class TestJFrameDirectpublic static void main(String args)/:创建窗口对象,窗口标题通过构造方法传递进去JFrame frm=new JFrame(这是我的第一个窗口应用程序);/:添加组件。本例中直接添加菜单frm.setJMenuBar(mb);mFile.add(miNew);/新建mFile.add(miOpen);/打开mFile.add(miSave);/保存mFile.addSeparator();/分割条mFile.add(miFont);/字体与颜色菜单mFile.addSeparator();
8、/分割条mFile.add(miQuit);/退出mb.add(mFile);/将文件菜单添加到菜单栏上/:设置窗口位置和大小frm.setBounds(10,10,400,300);/设置close按钮的操作frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/:显示窗口frm.setVisible(true);,、JFrame,/自定义菜单class FgMenu extends JMenupublic FgMenu(String label)super(label);public FgMenu(String label,int nAcce
9、lerator)super(label);setMnemonic(nAccelerator);,、JPanel,JPanel是一种轻量级的中间容器,称为面板组件,可以在它上面添加其他组件(包括其他面板组件)。面板(JPanel)的大小随着其包含的组件多少而变大变小。,import;import;import javax.swing.*;public class TestJPanel extends JFramepublic TestJPanel(String sTitle)super(sTitle);setSize(400,300);/设置大小/获取窗口面板;Container c=getCo
10、ntentPane();c.setBackground(Color.RED);/窗口背景红色c.setLayout(null);/取消布局器JPanel pan=new JPanel();pan.setBackground(Color.YELLOW);/pan背景黄色pan.setSize(200,100);add(pan);/用add方法把面板pan添加到窗口中setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);public static void main(String args)TestJPanel frm=new TestJPanel(JFra
11、me with JPanel);frm.setVisible(true);,、JScrollPanel,/*我的另一个java窗口程序,通过从JFrame继承得到自定义的窗口类:TestJFrameExtends*/import java.awt.*;import.*;import javax.swing.*;public class TestJFrameExtends extends JFrame/以下为成员变量(对象)的定义/此处定义菜单(与TestJFrameDirect.java中一样)JTextAreata=new JTextArea();/文本框TestJFrameExtends(
12、String sTitle)super(sTitle);/:添加组件。本例中直接添加菜单与JTextAreaaddMenus();/添加带滚动条(JScrollPane)的文本编辑框JTextAreaJScrollPane sp=new JScrollPane(ta);add(sp);/:设置窗口大小setSize(400,300);/设置close按钮的操作setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/使窗口在显示屏居中显示centerWindow();/改变窗口图标Toolkit tk=getToolkit();/得到一个Toolkit对象
13、 Image icon=tk.getImage(online.gif);/获取图标setIconImage(icon);,、JScrollPanel,/添加菜单private void addMenus()setJMenuBar(mb);mFile.add(miNew);/新建/./窗口居中public void centerWindow()/获得显示屏桌面窗口的大小Toolkit tk=getToolkit();Dimension dm=tk.getScreenSize();/让窗口居中显示setLocation(int)(dm.getWidth()-getWidth()/2,(int)(d
14、m.getHeight()-getHeight()/2);public static void main(String args)/:创建窗口对象TestJFrameExtends frm=new TestJFrameExtends(这是我的另一个java窗口程序);/:显示窗口frm.setVisible(true);/这里省略了FgMenu类的定义,、JScrollPanel,、JScrollPanel,、JSplitPane,/*分割条示例*/import javax.swing.*;import java.awt.*;public class TestJSplitPanepublic
15、static void main(String args)JFrame fr=new JFrame(JFrame with JSplitPane);Container c=fr.getContentPane();JPanel leftPane=new JPanel();/左面板JPanel rightPane=new JPanel();/右面板/创建水平分割条,即分为左右两部分JSplitPane sp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,leftPane,rightPane);sp.setDividerSize(5);/设置分割条本身的宽度为
16、5个像素leftPane.add(new JButton(left button);/将按钮添加到左边的面板rightPane.add(new JButton(right button);/将按钮添加到右边的面板c.add(sp);/将分割条(含左右两个带按钮的面板)添加到窗口上fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);fr.setSize(400,300);fr.setVisible(true);/以下语句须放在setVisible之后,否则不会起到效果sp.setDividerLocation(0.3);/左边占0.3(30%),右
17、边占0.7(70%),小节安排,图形用户界面编程,9.3、菜单和工具条,9.5、组件常用方法,9.1、AWT与Swing,9.2、容器:JFrameJPanelJScrollPaneJSplitPane,9.6、布局管理器,9.7、事件处理模型,9.4、基本组件:JLabelJButtonJComboBoxJTree等,9.8、鼠标事件处理,9.9、事件适配器类,9.10、键盘事件处理,、菜单组件:JMenuBar、JMenu、JMenuItem,、菜单组件:JMenuBar、JMenu、JMenuItem,菜单中的加速键,菜单(JMenu)或菜单项(JMenuItem)中所显示的带下划线的字
18、母即为对应的加速键字母。如前图所示,如果要通过加速键访问“保存(S)”菜单,首先按下ALT+F(文件菜单的加速键,JMenu),然后再按下S字母键即可(保存菜单项的加速键,JMenuItem)。父类的如下方法进行设置:public void setMnemonic(intmnemonic)其中 mnemonic为,XXX对应于相应的字母,如A、B、等。源文件加入:import.*;,、菜单组件:JMenuBar、JMenu、JMenuItem,例如:Import.*;/定义菜单变量(对象)JMenu mFile=new JMenu(文件(F);JMenuItem miNew=new JMenu
19、Item(新建(N),KeyEvent.VK_N),miOpen=new JMenuItem(打开(O);miFile.setMnemonic(KeyEvent.VK_F);miFile.add(miNew);miFile.add(miOpen);miOpen.setMnemonic(KeyEvent.VK_O);,、菜单组件:JMenuBar、JMenu、JMenuItem,菜单中的快捷键和图标,带加速键的菜单需要两步才能操作,快速键一次完成,如按下CTRL+S键即可触发保存菜单的功能 设置快捷键的方法定义在JMenuItem中,如下:public void setAccelerator(K
20、eyStrokekeyStroke)其中keyStroke则通常采用KeyStroke的如下静态方法获得。public static KeyStroke getKeyStroke(intkeyCode,intmodifiers)其中,keyCode是定义在中的虚拟键常量:而modifiers则是定义在中的修饰符常量:源文件加入:import.*;,、菜单组件:JMenuBar、JMenu、JMenuItem,例如:miNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_DOWN_MASK);miOpen
21、.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_DOWN_MASK|InputEvent.SHIFT_DOWN_MASK);ImageIcon icon=new ImageIcon(online.gif);miOpen.setIcon(icon);,、工具栏组件:JToolBar,(1)在JMenuBar对象创建的下一行创建工具栏对象:JToolBarmtb=new JToolBar();(2)自定义类FgButton如下:class FgButton extends JButtonpublic FgBu
22、tton()super();public FgButton(Icon icon)super(icon);public FgButton(Icon icon,String strToolTipText)super(icon);setToolTipText(strToolTipText);public FgButton(String text)super(text);public FgButton(String text,Icon icon,String strToolTipText)super(text,icon);setToolTipText(strToolTipText);,、工具栏组件:J
23、ToolBar,(3)添加addToolBar()方法:private void addToolBar()/工具条Container c=getContentPane();c.add(BorderLayout.NORTH,mtb);mtb.setLayout(new FlowLayout(FlowLayout.LEFT);FgButton btn=new FgButton(new ImageIcon(getClass().getResource(New.gif),新建文件),new FgButton(new ImageIcon(getClass().getResource(open.gif),
24、打开文件),new FgButton(new ImageIcon(getClass().getResource(save.gif),保存文件);for(int i=0;ibtn.length;i+)btni.setBorder(BorderFactory.createEmptyBorder();mtb.add(btni);/设置不可浮动mtb.setFloatable(false);(4)在构造方法中添加如下代码:addToolBar();,小节安排,图形用户界面编程,9.3、菜单和工具条,9.5、组件常用方法,9.1、AWT与Swing,9.2、容器:JFrameJPanelJScrollP
25、aneJSplitPane,9.6、布局管理器,9.7、事件处理模型,9.4、基本组件:JLabelJButtonJComboBoxJTree等,9.8、鼠标事件处理,9.9、事件适配器类,9.10、键盘事件处理,、JLabel,import java.awt.*;import javax.swing.*;public class TestJLabel extends JFramepublic TestJLabel()super(JFrame with JLabel);/三个标签上的文字String s=第一个标签,文字在图标的左侧,文字在图标的下方;ImageIcon ic=null,new
26、 ImageIcon(online.gif),new ImageIcon(save.gif);/三个标签在水平方向上的对齐方式int ih=0,JLabel.LEFT,JLabel.CENTER;/三个标签在垂直方向上的对齐方式int iv=0,JLabel.CENTER,JLabel.BOTTOM;Container c=getContentPane();/取得窗口的内容面板c.setLayout(new FlowLayout(FlowLayout.LEFT);/设置布局管理器,、JLabel,for(int i=0;i0)myLabel.setHorizontalTextPosition(
27、ihi);myLabel.setVerticalTextPosition(ivi);/设置边框,setBorder来自JLabel的父类JComponentmyLabel.setBorder(BorderFactory.createLineBorder(Color.RED,2);myLabel.setToolTipText(第+(i+1)+个标签);/加入到窗口的内容面板中c.add(myLabel);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(400,300);public static void main(String ar
28、gs)TestJLabel frm=new TestJLabel();frm.setVisible(true);,、单行文本框:JTextField和JPasswordField,import java.awt.*;import javax.swing.*;public class TestJTextFieldpublic static void main(String args)JFrame frm=new JFrame(JFrame with JTextField);frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.setSize
29、(260,100);Container c=frm.getContentPane();c.setLayout(new FlowLayout();JTextField t=new JTextField(2012103088,15),new JPasswordField(1234567890,15);c.add(new JLabel(用户名:);c.add(t0);c.add(new JLabel(密 码:);c.add(t1);t0.setEditable(false);/用户名设置为只读frm.setVisible(true);,、按钮:JButtom、JCheckBox和JRadioButt
30、on,import java.awt.*;import javax.swing.*;public class TestJButton extends JFrameTestJButton(String sTitle)super(sTitle);Container c=getContentPane();c.setLayout(new FlowLayout();/两个按钮上的图标ImageIcon ic=new ImageIcon(new.gif),new ImageIcon(online.gif);/三个按钮JButton btn=new JButton(新建,ic0),new JButton(中
31、间),new JButton(打开,ic1);int i;for(i=0;ibtn.length;i+)c.add(btni);/btn0的文字在图标左侧btn0.setHorizontalTextPosition(SwingConstants.LEFT);/两个复选框JCheckBox ck=new JCheckBox(左),new JCheckBox(右);for(i=0;ick.length;i+)c.add(cki);cki.setSelected(true);/将复选框设置为选中状态,、按钮:JButtom、JCheckBox和JRadioButton,/两个单选框JRadioBut
32、ton r=new JRadioButton(左),new JRadioButton(右);ButtonGroup rg=new ButtonGroup();for(i=0;i r.length;i+)c.add(ri);rg.add(ri);/组成ButtonGroup,这样二者只能同时选中一项/设置单选框的选择状态r0.setSelected(true);r1.setSelected(false);setSize(300,150);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);public static void main(String ar
33、gs)TestJButton frm=new TestJButton(JFrame with JButton);frm.setVisible(true);,、下拉框:JComboBox,import java.awt.*;import javax.swing.*;public class TestJComboBox extends JFrame/字体与大小下拉框JComboBox cbxFont=new JComboBox();JComboBox cbxFontSize=new JComboBox();/字体大小TestJComboBox(String sTitle)super(sTitle)
34、;Container c=getContentPane();c.setLayout(new FlowLayout(FlowLayout.LEFT);c.add(new JLabel(字体名称:);c.add(cbxFont);c.add(new JLabel(字体大小:);c.add(cbxFontSize);/初始化字体与大小下拉框InitFonts();setSize(300,120);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);,、下拉框:JComboBox,/初始化字体框private void InitFonts()/获得系统的字体数
35、组GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();String fontList=ge.getAvailableFontFamilyNames();int i;/添加字体名称for(i=0;ifontList.length;i+)cbxFont.addItem(String.valueOf(i)+|+fontListi);cbxFont.setSelectedIndex(231);/选择index为30的项/添加字体大小for(i=9;i=72;i+)cbxFontSize.addItem(new
36、 Integer(i).toString();cbxFontSize.setSelectedIndex(3);/选择index为3的项public static void main(String args)TestJComboBox frm=new TestJComboBox(JFrame with JComboBox);frm.setVisible(true);,、列表框:JList,import java.awt.*;import javax.swing.*;public class TestJList extends JFrame/声明列表框对象JList listNames=new J
37、List();TestJList(String sTitle)super(sTitle);Container c=getContentPane();/以下语句保证列表框数据较多时会出现滚动条JScrollPane scrollPane=new JScrollPane(listNames);c.add(scrollPane);/初始化列表框InitFonts();setSize(250,150);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);,、列表框:JList,/初始化列表框private void InitFonts()String name
38、s=201126100101-曹帝胄,201126100111-洪峰,201126100128-徐华鹏,201126100131-姚臻平,201126100202-陈思行,201126100207-姜楠,201126100210-林一民,201126100211-林泽伟;/用数组填充列表框listNames.setListData(names);/将1、3的项(201126100111和201126100131)设置为选择状态listNames.setSelectedIndices(new int1,3);public static void main(String args)TestJLis
39、t frm=new TestJList(JFrame with JList);frm.setVisible(true);,、多行文本框:JTextArea,、多行文本框:JTextArea,、表格组件:JTable,import;import;import;import;import;import;import;import;public class TestJTablepublic static void main(String args)JTable table1=new JTable(12,6);/12行6列的空表格/定义列名与行数据,其中列名最好用final修饰final Object
40、 columnNames=姓名,性别,家庭地址,电话号码,生日;Object rowData=张国伟,男,浙江杭州,1378313210,1985-03-24,叶苛,女,浙江金华 程陈,男,江苏南京 曹艳,女,浙江温州,81513779,1986-10-01,刘飞,男,浙江宁波/创建表格JTable table2=new JTable(rowData,columnNames);,、表格组件:JTable,/设置表格属性table2.setRowHeight(30);/设置每行的高度为30table2.setRowHeight(0,20);/设置第1行的高度为20,作为区别table2.setR
41、owMargin(5);/设置相邻两行的距离table2.setRowSelectionAllowed(true);/设置可否被选择,默认为falsetable2.setSelectionBackground(Color.BLUE);/设置所选择行的背景颜色table2.setSelectionForeground(Color.WHITE);/设置所选择行的前景色table2.setGridColor(Color.BLACK);/设置网格线的颜色table2.setRowSelectionInterval(0,2);/设置初始的选择行(1到3行)table2.setShowHorizontal
42、Lines(false);/是否显示水平的网格线table2.setShowVerticalLines(true);/是否显示垂直的网格线table2.setValueAt(无名氏,0,0);/设置某个单元格的值,这个值是一个对象table2.doLayout();table2.setBackground(Color.lightGray);/设置表格背景色,、表格组件:JTable,/设置表格的大小table2.setPreferredScrollableViewportSize(new Dimension(600,100);/创建窗口中将要用到的面板JScrollPane pane1=new
43、 JScrollPane(table1);JScrollPane pane2=new JScrollPane(table2);JPanel pan=new JPanel(new GridLayout(0,1);pan.setPreferredSize(new Dimension(600,250);pan.setBackground(Color.black);pan.add(pane1);pan.add(pane2);/创建窗口JFrame frm=new JFrame(JFrame with JTable);frm.setDefaultCloseOperation(JFrame.EXIT_ON
44、_CLOSE);frm.setContentPane(pan);frm.pack();frm.setVisible(true);,、树形组件:JTree,根节点,分支节点,折叠节点,展开节点,叶子节点,、树形组件:JTree,import;import;import;import;import;import;import;import;import;import;import;import;public class TestJTreepublic static void main(String args)JFrame frm=new JFrame(JFrame with JTree);/构造方
45、法:JTree()JTree example1=new JTree();/构造方法:JTree(Object value)Object letters=a,b,c,d,e;JTree example2=new JTree(letters);/构造函数:JTree(TreeNode root),但是root为一个空节点DefaultMutableTreeNode node1=new DefaultMutableTreeNode();/定义树节点/用此树节点做参数调用 JTree的构造函数创建含有一个根节点的树JTree example3=new JTree(node1);,、树形组件:JTree
46、,/构造函数:JTree(TreeNode root)(同上,只是root非空)/用一个根节点创建树 DefaultMutableTreeNode node2=new DefaultMutableTreeNode(Color);JTree example4=new JTree(node2);/节点颜色默认为白底黑字 example4.setBackground(Color.lightGray);/设置节点的背景颜色/构造函数:JTree(TreeNode root,boolean asksAllowsChildren)/使用DefaultMutableTreeNode类先用根结点创建树,设置为
47、可添加孩子结点,/再添加孩子结点 DefaultMutableTreeNode color=new DefaultMutableTreeNode(Color,true);DefaultMutableTreeNode gray=new DefaultMutableTreeNode(Gray);color.add(gray);color.add(new DefaultMutableTreeNode(Red);gray.add(new DefaultMutableTreeNode(Lightgray);gray.add(new DefaultMutableTreeNode(Darkgray);col
48、or.add(new DefaultMutableTreeNode(Green);JTree example5=new JTree(color);,、树形组件:JTree,/构造函数:JTree(TreeNode root)(同上,只是root非空)/先创建各个节点 DefaultMutableTreeNode biology=new DefaultMutableTreeNode(Biology);DefaultMutableTreeNode animal=new DefaultMutableTreeNode(Animal);DefaultMutableTreeNode mammal=new
49、DefaultMutableTreeNode(Mammal);DefaultMutableTreeNode horse=new DefaultMutableTreeNode(Horse);mammal.add(horse);animal.add(mammal);biology.add(animal);/根据创建好的节点创建树JTree example6=new JTree(biology);/获取并显示mammal的路径TreePath p=new TreePath(mammal.getPath();example6.expandPath(p);JOptionPane.showMessageD
50、ialog(frm,p.toString(),Path of Mammal TreeNode,JOptionPane.INFORMATION_MESSAGE);,、树形组件:JTree,/将这些树添加到窗口面板中JPanel pan=new JPanel();pan.setLayout(new BoxLayout(pan,BoxLayout.X_AXIS);pan.setPreferredSize(new Dimension(600,200);pan.add(new JScrollPane(example1);pan.add(new JScrollPane(example2);pan.add(