JAVA 第11章 图形用户界面编程基础ppt课件.ppt

上传人:牧羊曲112 文档编号:1376273 上传时间:2022-11-16 格式:PPT 页数:62 大小:883KB
返回 下载 相关 举报
JAVA 第11章 图形用户界面编程基础ppt课件.ppt_第1页
第1页 / 共62页
JAVA 第11章 图形用户界面编程基础ppt课件.ppt_第2页
第2页 / 共62页
JAVA 第11章 图形用户界面编程基础ppt课件.ppt_第3页
第3页 / 共62页
JAVA 第11章 图形用户界面编程基础ppt课件.ppt_第4页
第4页 / 共62页
JAVA 第11章 图形用户界面编程基础ppt课件.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《JAVA 第11章 图形用户界面编程基础ppt课件.ppt》由会员分享,可在线阅读,更多相关《JAVA 第11章 图形用户界面编程基础ppt课件.ppt(62页珍藏版)》请在三一办公上搜索。

1、第11章 图形用户界面编程基础,11.1 图形用户界面核心概念11.2 容器与布局管理11.3 常用GUI标准组件11.4 鼠标和键盘事件,11.1 图形用户界面核心概念,容器-可以容纳GUI部件(按某种布局) -窗体 、面板,部件-部署在容器中,实现某种交互。 -文本框、按纽、标签等,GUI部件, 第1步 创建窗体,方法1: Frame f = new Frame(标题 ),方法2: class MyFrame extends Frame . Frame f = new MyFrame(标题 ),让窗体可见 f.setSize(200,300); f.setVisible(true);, 第

2、2步 创建GUI部件,创建按钮、标签Button b=new Button(“计数”);Label dis=new Label(“0”);,0, 第3步 将部件加入窗体容器,布局设置 setLayout(new FlowLayout(),加入部件 add(b); add(dis);, 第4步 处理事件,事件处理 -委托事件处理模型-事件源将事件委托给事件监听者处理事件监听者-负责处理事件 -符合相应接口要求,事件源-发生事件,单击,事件委托处理图,button.addActionListener( ActionListener a );,(1)事件源对象的容器类作为监听者 addActionL

3、istener(this);,(2)用内嵌类实现 addActionListener( new Process() );, 谁作为监听者合适? -要其actionPerformed方法中方便访问事件处理相关对象,(3)用匿名内嵌类实现 addActionListener( new ActionListener() . );,表11-1 AWT事件接口及处理方法, 区分事件源,编写一个窗体应用程序,在窗体中安排两个文本框,一个标签,两个标记为“+”和“*”的按钮,从两个文本框输入两个数,点击“+”按钮将文本框中两个数进行加法运算,结果显示在标签中;点击“*”按钮将文本框中两个数进行减法运算,结果

4、显示在标签中。, 在动作事件处理代码中区分事件源,getSource() 用来获取事件源对象。,getActionCommand() 结果为字符串,用来获取按钮事件对象的命令名,-ActionEvent对象提供方法, 关键代码,public void actionPerformed(ActionEvent e) int x1=Integer.parseInt(f1.getText(); int x2=Integer.parseInt(f2.getText(); if ( e.getActionCommand().equals(“+”) ) res.setText(+(x1+x2); else

5、res.setText(+(x1*x2); , 或者,public void actionPerformed(ActionEvent e) int x1=Integer.parseInt(f1.getText(); int x2=Integer.parseInt(f2.getText(); if ( e.getSource() = b1 ) res.setText(+(x1+x2); else res.setText(+(x1*x2); ,假设,将b1定为实例变量 b1=new Button(“+”);, 关于事件适配器类,Java中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常

6、命名为XxxAdapter,在该类中以空方法体实现了相应接口的所有方法程序员设计可通过继承适配器类来编写监听者类,在类中只需给出关心的方法。,例11-2 处理窗体的关闭,class MyFrame extends Frame implements ActionListener public MyFrame() super(“测试窗体关闭); Button btn=new Button(关闭); setLayout(new FlowLayout(); add(btn); btn.addActionListener(this); addWindowListener(new closeWin();

7、setSize(300,200); setVisible(true); ,ublic void actionPerformed(ActionEvent e) if ( e.getActionCommand().equals(关闭) ) dispose(); class closeWin extends WindowAdapter public void windowClosing(WindowEvent e) Window w=e.getWindow(); w.dispose(); ,只要写自己关心的方法, 项目,1. 编写一个窗体应用,窗体中安排1个按钮,点击按钮让按钮的背景颜色随机变化。2

8、.设有一批英文单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签显示单词,另有“上一个”、“下一个”两个按钮实现单词的前后翻动。,FlowLayout(流式布局) BorderLayout(边缘或方位布局) GridLayout(网格布局) CardLayout(卡片式布局) GridBagLayout(网格块布局),11.2 容器与布局管理,11.2.1 FlowLayout(流式布局)-是Panel的默认布局,从上到下、左到右排放,放不下再换至下一行 -不会改变控件的大小。,按照参数要求安排部件间的纵横间隔和对齐方式,ublic FlowLayout() 居中对齐方式

9、,组件纵横间隔5个像素。 public FlowLayout(int align, int hgap, int vgap) 3个参数分别指定对齐方式、纵、横间距 public FlowLayout(int align) 参数规定对齐方式,组件纵横间距默认5个像素。,【例11-3】 大小不断递增的9个按钮放入窗体中,ublic FlowLayoutExample( ) setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10); String spaces = “”; / 用来使按钮的大小变化 for (int i = 1; i = 9; i+) add(

10、new Button(“B #” + i + spaces);spaces += “ ”; ,放大窗体后,11.2.2 BorderLayout(边缘或方位布局)-是Frame的默认布局,将容器内部空间分为东(East)、南(South)、西(West)、北(North)、中(Center)五个区域,控件的大小随容器大小改变。,按照参数要求安排部件间的纵横间隔和对齐方式,ublic BorderLayout() 各组件之间的纵横间距为0 public BorderLayout(int hgap, int vgap) 2个参数分别指定纵、横间距,加入组件 add(方位名字符串, 组件),Stri

11、ng borders = North, East, South, West, Center; setLayout(new BorderLayout(10, 10); for(int i = 0; i 5; i+) add(bordersi, new Button(bordersi); ,【例11-4】 实现一个简单的图像浏览窗体,部署“上一张”、“下一张”两个按钮,单击按钮可前后翻阅图片。,import java.awt.*; import java.awt.event.*;public class ShowAnimator extends Frame implements ActionLis

12、tener Image m_Images; /保存图片序列的Image数组 int totalImages = 4; /图片序列中的图片总数为18 int pos = 0; /当前显示图片的序号 Button b1,b2; public ShowAnimator() m_Images = new ImagetotalImages; Toolkit t = getToolkit(); for(int i=0; itotalImages; i+) m_Imagesi = t.getImage( imagesimage + i+.gif);,用Tookit对象的getImage方法获取图像,图像路径

13、相对Java应用程序位置,Button b1=new Button(上一张); Button b2=new Button(下一张); setLayout(new BorderLayout( ); Panel operate=new Panel( ); operate.setLayout(new FlowLayout(FlowLayout.CENTER); operate.add(b1); operate.add(b2); add(South,operate); /操作控制面板安排在底部 b1.addActionListener(this); b2.addActionListener(this)

14、; public void paint(Graphics g) g.drawImage(m_Imagespos,50,50,this); ,ublic void actionPerformed(ActionEvent e) if (e.getSource( )=b1) /区分事件源 if (pos 0) pos = - pos; /上一张 else pos = + pos % totalImages; /下一张 repaint( ); public static void main(String a) Frame m= new ShowAnimator(); m.setSize(200,200

15、); m.setVisible(true); ,11.2.3 GridLayout布局,把容器的空间分为若干行乘若干列的网格区域 组件按从左向右,从上到下的次序被加到各单元格中 组件的大小将调整为与单元格大小相同。, GridLayout构造方法,ublic GridLayout() 所有组件在一行中。 public GridLayout(int rows,int cols) 通过参数指定布局的行和列数。 public GridLayout(int rows,int cols,int hgaps,int vgaps) 指定划分的行列数以及组件间的水平和垂直间距。,add(组件名), GridL

16、ayout布局加入组件,setLayout(new GridLayout(3, 3, 10, 10); for (int i = 1; i = 9; i+) add(new Button(Button # + i);,【例11-3】 布局修改,思考:如何布局?,11.2.4 CardLayout布局,加入的部件叠成卡片的形式,组件加入 add(字符串, 组件名)其中,字符串用来标识卡片名称。, CardLayout布局-卡片翻动,show(容器,字符串):显示指定名称的卡片 first(容器) :显示第一块卡片 last(容器) :显示最后一块卡片 next(容器) :显示下一块卡片,11.3

17、 常用GUI部件, Component类(抽象类),Color getBackground() :获取部件的背景色 Font getFont() :获取部件的显示字体 Graphics getGraphics(): 获取部件的Graphics属性对象 void repaint(int x,int y,int width,int height) : 对部件的特定区域进行重新绘图 void setBackground(Color c) : 设置部件的背景 void setEnabled(boolean b) :是否让部件功能有效 void setFont(Font f) : 设置部件的显示字体 v

18、oid setSize(int width,int height) :设置部件大小 void setVisible(boolean b) : 设置部件是否可见 void setForeground(Color c) : 设置部件的前景色 void requestFocus() : 让部件得到焦点 void add(PopupMenu popup) :给部件加入弹出菜单,1. 文本框只能编辑一行数据,构造方法有四种: TextField():构造一个单行文本输入框。 TextField(int):指定长度的单行文本输入框。 TextField(String):指定初始内容的单行文本输入框。 Te

19、xtField(String, int):指定长度、指定初始内容。,tf1 = new TextField(); tf2 = new TextField(, 20); tf3 = new TextField(Hello!); tf4 = new TextField(Hello, 30);,11.3.2 文本框与文本域,2. 文本域(TextArea),特点1:可以编辑多行文字,构造方法有四种: TextArea( ):构造一个文本域。 TextArea(int, int):构造一个指定长度和宽度的文本域。 TextArea(String):构造一个显示指定文字的文本域。 TextArea(St

20、ring, int, int):按指定长度、宽度和默认值构造文本域。,常用方法: setEchoChar(*) 设置回显字符 getText( ):获取输入框中的数据 setText( ):往输入框写入数据 isEditable( ):判断输入框是否可编辑。 void select(int start,int end):选定由开始和结束位置指定的文本。void selectAll( ):选定所有文本。,3文本部件的常用方法,以下方法只限于文本域append(String s):将字符串添加到文本域的末尾 insert(String s,int index):将字符串插入到文本域的指定位置,4.

21、 文本框(TextField)-事件,ActionEvent事件-在文本框按回车键时引发 注册:addActionListener( ); 接口:ActionListener 方法: public void actionPerformed(ActionEvent e),TextEvent事件-对文本输入部件数据更改操作 (添加、修改、删除)注册: addTextListener( )接口:TextListener方法: public void textValueChanged(TextEvent e), 练习:验证密码域只能输入数字字符,ublic void textValueChanged(

22、TextEvent e) String s = pass.getText(); char last=s.charAt(s.length()-1); if (! Character.isDigit(last) hint.setText(只能是数字,重输:); pass.setText(); ,【例11-7】在图形界面中,安排一个文本框和文本域。将文本框键入字符同时显示在文本域中。,import java.applet.*;import java.awt.*;import java.awt.event.*;public class TextIn extends Frame implements T

23、extListener,ActionListener TextField tf; TextArea ta; String pre = ; /记录文本域的先前内容 public TextIn( ) tf = new TextField(20); ta = new TextArea(8,20); add (South, tf); add(Center,ta); tf.addTextListener(this);,tf.addActionListener(this); public void textValueChanged(TextEvent e) String s = tf.getText( )

24、; ta.setText(pre+s); /更新文本域内容 public void actionPerformed(ActionEvent e) tf.setText(); /清空文本框 ta.append(n); /添加一个换行符 pre= ta.getText( ); public static void main(String a) . /创建窗体并可见 ,11.4.1 鼠标事件,共有7种情形,用 MouseEvent类的同名静态整型常量标志, 分别是:MOUSE_DRAGGEDMOUSE_ENTEREDMOUSE_EXITEDMOUSE_MOVED MOUSE_PRESSEDMOUSE

25、_RELEASEDMOUSE_CLICKED, 鼠标事件的处理接口,MouseListener 负责接收和处理鼠标的press(按下)、release(释放)、click(点击)、enter(移入)和exit(移出)动作触发的事件; MouseMotionListener 负责接收和处理鼠标的move(移动)和drag(拖动)动作触发的事件。, MouseEvent类,ublic int getX() :返回发生鼠标事件的 X坐标。public int getY() :返回发生鼠标事件的 Y坐标。public Point getPoint() :返回 Point对象,也即鼠标事件发生的坐标点。

26、public int getClickCount() :返回鼠标点击事件的连击次数。,高级语义事件和低级语义事件,常见的低级语义事件有:组件事件(ComponentEvent):组件尺寸的变化,移动;容器事件(ContainerEvent):容器中组件增加,移除;窗口事件(WindowEvent):关闭窗口,图标化;焦点事件(FocusEvent):焦点的获得和丢失;键盘事件(KeyEvent):键按下、释放;鼠标事件(MouseEvent):鼠标单击,移动等。,高级语义事件以组件为基础;例如:按钮上动作事件。低级语义事件具有更广泛性:例如:按钮上鼠标移动、点击、进入等。低级语义事件先于高级语

27、义事件发生。,例11-8 围棋对弈界面设计,#01 import java.awt.*;#02 import java.awt.event.*;#03 public class chessGame extends Frame #04 chessBoard b = new chessBoard( ); #05 #06 public chessGame( ) #07 setBackground(Color.lightGray);#08 setLayout(new BorderLayout( );#09 add(“Center”, b); /棋盘 #10 Panel p = new Panel( )

28、;#11 Button pass = new Button(放弃一手);#12 Button color = new Button(变棋盘背景);#13 Button fail = new Button(认输);#14 Button back = new Button(悔棋);#15 p.setLayout(new GridLayout(8, 1, 10, 10);,部署界面,.add(new Label( ); / 插入一个空标签p.add(pass);p.add(color);p.add(fail);p.add(back);add(“East”, p);setSize(500, 450);

29、setVisible(true);public static void main(String args) new chessGame( );,部署界面,class chessBoard extends Canvas int chess = new int1919; / 存放棋盘子的状态int sx = 20, sy = 20; / 棋盘左上角位置int w = 20; / 棋盘每个格子宽度int cx = 50; / 下棋位置游标的初值,对应鼠标移动位置int cy = 50;int player = 1; /1表示轮黑下子,0表示轮白下子public chessBoard( ) this.

30、addMouseMotionListener(new MouseMotionAdapter( ) ,鼠标移动则红色小方框跟随,ublic void mouseMoved(MouseEvent e) Graphics g = getGraphics( ); g.setXORMode(chessBoard.this.getBackground( );g.setColor(Color.red);g.fillRect(cx - w / 4, cy - w / 4, w / 2, w / 2);cx = sx + (e.getX( ) -sx+w/2) / w * w; cy = sy + (e.get

31、Y( ) -sy+w/2) / w * w;g.fillRect(cx - w / 4, cy - w / 4, w / 2, w / 2); ); this.addMouseListener(new MouseAdapter( ) public void mouseClicked(MouseEvent e) /鼠标点击表示下子Graphics g = getGraphics( );,鼠标移动则红色小方框标记跟随,if (chess(cx - sx)/w(cy - sy)/w = 0) if (player = 1) g.setColor(Color.black); / 黑棋chess(cx

32、- sx) / w(cy - sy) / w = 1; else g.setColor(Color.white); / 白棋chess(cx - sx) / w(cy - sy) / w = 2;g.fillOval(cx - w / 2 + 1, cy - w / 2 + 1, w - 2, w - 2);player = (player + 1) % 2; / 黑白方轮流下子g.setXORMode(chessBoard.this.getBackground( );g.setColor(Color.red); /用异或方式绘制小游标g.fillRect(cx - w / 4, cy - w

33、 / 4, w / 2, w / 2);); ,绘制刚下的棋子,ublic void paint(Graphics g) for (int k = 0; k 19; k+) /绘制棋盘 g.drawLine(sx, sy + k * w, sx + w * 18, sy + k * w); for (int k = 0; k 19; k+) g.drawLine(sx + k * w, sy, sx + k * w, sy + w * 18); for (int i = 0; i chess.length; i+) for (int j = 0; j chess0.length; j+) if

34、 (chessij = 1) g.setColor(Color.black);g.fillOval(sx + i * w - w/2 + 1, sx + j * w - w/2 + 1,w - 2, w - 2);,二重循环控制绘制所有棋子, else if (chessij = 2) g.setColor(Color.white);g.fillOval(sx + i * w - w/2 + 1, sx + j * w - w/2 + 1,w - 2, w - 2); g.setXORMode(this.getBackground( ); g.setColor(Color.red); g.fi

35、llRect(cx - w / 4, cy - w / 4, w / 2, w / 2);,11.4.2 键盘事件,包含 3个,分别对应 KeyEvent类的几个同名的静态整型常量KEY_PRESSED、 KEY_RELEASED、KEY_TYPED。监听者接口是KeyListener public void keyPressed(KeyEvent e) 某个键按下时执行。 public void keyReleased(KeyEvent e) 某键被释放时执行。 public void keyTyped(KeyEvent e) 按键被敲击。 KeyTyped包含keyPressed和KeyR

36、elased两个动作, 如何获取击键值,getKeyChar()-获取输入字符(对字符键)getKeyCode()-获取键的编码(对控制键) 键编码常量KeyEvent.VK_LEFT) -按键为左箭头KeyEvent.VK_RIGHT) -右箭头KeyEvent.VK_UP) - 向上箭头 KeyEvent.VK_DOWN) -向下箭头,例11-9 小方框变色和移动,import java.awt.*;import java.awt.event.*;public class KeyboardDemo extends Frame implements KeyListener static fi

37、nal int SQUARE_SIZE = 20; /小方框的边长 Color squareColor; /小方框的颜色 int squareTop, squareLeft; /小方框的左上角坐标 public KeyboardDemo( ) squareTop = 100; /初始小方框位置 squareLeft = 100; squareColor = Color.red; /初始颜色设置为红色 addKeyListener(this); /注册键盘事件监听 repaint( ); ,ublic void paint(Graphics g) g.setColor(squareColor);

38、 g.fillRect(squareLeft, squareTop, SQUARE_SIZE, SQUARE_SIZE); /* 用键盘控制小方块颜色的改变 */ public void keyTyped(KeyEvent evt) char ch = evt.getKeyChar( ); /获取输入字符 if (ch = B | ch = b) squareColor = Color.blue; repaint( ); else if (ch = G | ch = g) squareColor = Color.green; repaint( ); ,/* 用键盘控制小方块的移动 */ pub

39、lic void keyPressed(KeyEvent evt) int key = evt.getKeyCode( ); /获取按键的编码 if (key = KeyEvent.VK_LEFT) /按键为左箭头 squareLeft -= 8; if (squareLeft getSize( ).width - 3 - SQUARE_SIZE) squareLeft = getSize( ).width - 3 - SQUARE_SIZE; repaint(); ,else if (key = KeyEvent.VK_UP) /按键为向上箭头 squareTop -= 8; if (squ

40、areTop getSize( ).height - 3 - SQUARE_SIZE) squareTop = getSize( ).height - 3 - SQUARE_SIZE; repaint(); public void keyReleased(KeyEvent evt) ,public static void main(String args ) Frame x= new KeyboardDemo( ); x.setSize(300,300); x.setVisible(true); ,思考,举例说明什么是容器?其默认布局是什么?ava事件处理的要素有哪些?窗体关闭如何实现?什么是高级语义事件,什么是低级语义事件?事件处理适配器和接口有什么关系?回答鼠标和键盘事件的接口,编程要点有哪些?, 上机实践,1.编写窗体应用程序,统计一个文本域输入文本的行数、单词数和字符数。可在图形界面中安排一个按钮、一个文本域和一个标签,点击按钮开始统计,在标签中显示结果。 2.编写窗体应用程序,安排一个文本框、一个按钮和一个标签,从文本框录入一个数字(09),点击按钮将其对应的英文单词(如:zero,one等)显示在标签中 。 3. 实现一个人机对弈五子棋游戏程序。支持开始、晦棋、改变棋盘背景等。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号