JAVA-第11章-图形用户界面编程基础ppt课件.ppt
J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )11.1 11.1 图形用户界面核心概念图形用户界面核心概念11.2 11.2 容器与布局管理容器与布局管理11.3 11.3 常用常用GUIGUI标准组件标准组件11.4 11.4 鼠标和键盘事件鼠标和键盘事件J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )11.1 11.1 图形用户界面核心概念图形用户界面核心概念 容器容器-可以容纳可以容纳GUIGUI部件(按某种布局)部件(按某种布局) -窗体窗体 、面板、面板 部件部件-部署在容器中,实现某种交互。部署在容器中,实现某种交互。 - -文本框、按纽、标签等文本框、按纽、标签等GUI部件部件 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 第第1 1步步 创建窗体创建窗体 方法方法1: Frame f = new Frame(标题标题 ) 方法方法2: class MyFrame extends Frame . Frame f = new MyFrame(标题标题 )让窗体可见让窗体可见p f.setSize(200,300);p f.setVisible(true);J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 第第2 2步步 创建创建GUIGUI部件部件 创建按钮、标签创建按钮、标签Button b=new Button(Button b=new Button(“计数计数”););Label dis=new Label(Label dis=new Label(“0 0”););0J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 第第3 3步步 将部件加入窗体容器将部件加入窗体容器 布局设置布局设置 setLayout(new FlowLayout()setLayout(new FlowLayout() 加入部件加入部件 add( add(b);); add(add(dis););0J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 第第4 4步步 处理事件处理事件事件处理事件处理 -委托委托事件处理模型事件处理模型-事件源将事件委托给事件监听者处理事件源将事件委托给事件监听者处理事件监听者事件监听者-负责处理事件负责处理事件 - -符合相应接口要求符合相应接口要求事件源事件源-发生事件发生事件单击单击J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )事件委托处理事件委托处理图图button.addActionListener( ActionListener a ); 12单击单击3J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )(1)事件源对象的容器类作为监听者)事件源对象的容器类作为监听者 addActionListener(this); (2)用内嵌类实现)用内嵌类实现 addActionListener( new Process() ); 谁作为监听者合适谁作为监听者合适? -要其要其actionPerformed方法中方法中方便访问方便访问事件处理相关对象事件处理相关对象 (3)用匿名内嵌类实现)用匿名内嵌类实现 addActionListener( new ActionListener() . );J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )表11-1 AWT事件接口及处理方法描述信息描述信息接口名称接口名称方法(事件)方法(事件)点击按钮、点击菜点击按钮、点击菜单项、文本框按回单项、文本框按回车等动作车等动作ActionListeneractionPerformed(ActionEvent)选择了可选项的项选择了可选项的项目目ItemListeneritemStateChanged(ItemEvent)文本部件内容改变文本部件内容改变TextListenertextValueChanged(TextEvent)移动了滚动条等部移动了滚动条等部件件AdjustmentListeneradjustmentVlaueChanged(AdjustmentEvent)鼠标移动鼠标移动MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)鼠标点击等鼠标点击等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )键盘输入键盘输入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)部件收到或失部件收到或失去焦点去焦点FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)部件移动、缩部件移动、缩放、显示放、显示/隐隐藏等藏等ComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)窗口事件窗口事件WindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified (WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)容器增加容器增加/删除删除部件部件ContainerListenercomponentAdded(ContainerEvent)componentRemoved(ContainerEvent)J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 区分事件源区分事件源 编写一个窗体应用程序,在窗体中安排两个编写一个窗体应用程序,在窗体中安排两个文本框,一个标签,两个标记为文本框,一个标签,两个标记为“+ +”和和“* *”的按的按钮,从两个文本框输入两个数,钮,从两个文本框输入两个数,点击点击“+ +”按钮按钮将将文本框中两个数进行加法运算,结果显示在标签文本框中两个数进行加法运算,结果显示在标签中中; ;点击点击“* *”按钮按钮将文本框中两个数进行减法运算,将文本框中两个数进行减法运算,结果显示在标签中。结果显示在标签中。 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 在动作事件处理代码中区分事件源在动作事件处理代码中区分事件源 getSource() 用来获取事件源对象。用来获取事件源对象。 getActionCommand() 结果为字符串,用来获取按钮事件对象的命令名结果为字符串,用来获取按钮事件对象的命令名 -ActionEvent对象提供方法对象提供方法J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 关键代码关键代码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 res.setText(+(x1*x2); J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 或者或者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(“+”);J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 关于事件适配器类关于事件适配器类 JavaJava中为那些具有多个方法的监听者接口提供中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常命名为了事件适配器类,这个类通常命名为XxxAdapterXxxAdapter,在该类中以空方法体实现了相应,在该类中以空方法体实现了相应接口的所有方法接口的所有方法程序员设计可通过程序员设计可通过继承适配器类继承适配器类来编写监听者来编写监听者类,在类中只需给出关心的方法。类,在类中只需给出关心的方法。 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )例例11-2 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(); setSize(300,200); setVisible(true); J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) public void actionPerformed(ActionEvent e) if ( e.getActionCommand().equals(关闭关闭) ) dispose(); class closeWin extends WindowAdapter public void windowClosing(WindowEvent e) Window w=e.getWindow(); w.dispose(); 只要写自己关心的方法只要写自己关心的方法J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 项目项目1. 1. 编写一个窗体应用,窗体中安排编写一个窗体应用,窗体中安排1 1个按钮,点击个按钮,点击按钮让按钮的背景颜色随机变化。按钮让按钮的背景颜色随机变化。2.2.设有一批英文单词存放在一个数组中,编制一个设有一批英文单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签图形界面程序浏览单词。在界面中安排一个标签显示单词,另有显示单词,另有“上一个上一个”、“下一个下一个”两个按两个按钮实现单词的前后翻动。钮实现单词的前后翻动。 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) FlowLayout(流式布局流式布局) BorderLayout(边缘或方位布局边缘或方位布局) GridLayout(网格布局网格布局) CardLayout(卡片式布局卡片式布局) GridBagLayout(网格块布局网格块布局) 11.2 容器与布局管理容器与布局管理J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )11.2.1 FlowLayout(11.2.1 FlowLayout(流式布局流式布局)-是是PanelPanel的默认布局的默认布局 从上到下、左到右排放,放不下再换至下一行从上到下、左到右排放,放不下再换至下一行 -不会改变控件的大小不会改变控件的大小。 按照参数要求安排部件间的纵横间隔纵横间隔和对齐方式对齐方式 public FlowLayout() 居中对齐方式,组件纵横间隔5个像素。 public FlowLayout(int align, int hgap, int vgap) 3个参数分别指定对齐方式、纵、横间距 public FlowLayout(int align) 参数规定对齐方式对齐方式,组件纵横间距纵横间距默认5个像素。J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )【例例11-311-3】 大小不断递增的大小不断递增的9 9个按钮放入窗体中个按钮放入窗体中public FlowLayoutExample( ) setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10); String spaces = “”; / 用来使按钮的大小变化用来使按钮的大小变化 for (int i = 1; i = 9; i+) add(new Button(“B #” + i + spaces);spaces += “ ”; 放大窗体后放大窗体后J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )11.2.2 BorderLayout(11.2.2 BorderLayout(边缘或方位布局边缘或方位布局)-是是FrameFrame的默认布局的默认布局 将容器内部空间分为东(将容器内部空间分为东(East)、南()、南(South)、西)、西(West)、北()、北(North)、中()、中(Center)五个区域)五个区域 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 控件的大小随容器大小改变。控件的大小随容器大小改变。 按照参数要求安排部件间的纵横间隔纵横间隔和对齐方式对齐方式 public BorderLayout()() 各组件之间的纵横间距为各组件之间的纵横间距为0 public BorderLayout(int hgap, int vgap) 2个参数分别指定纵、横间距个参数分别指定纵、横间距 加入组件加入组件 add(方位名字符串方位名字符串, 组件组件) J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) String borders = North, East, South, West, Center; setLayout(new BorderLayout(10, 10); for(int i = 0; i 5; i+) add(bordersi, new Button(bordersi); J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )【例例 11-411-4】 实现一个简单的图像浏览窗体,部署实现一个简单的图像浏览窗体,部署“上一上一张张”、“下一张下一张”两个按钮,单击按钮可前后翻阅图片。两个按钮,单击按钮可前后翻阅图片。import java.awt.*; import java.awt.event.*;public class ShowAnimator extends Frame implements ActionListener 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; i0) pos = - pos; /上一张上一张 else pos = + pos % totalImages; /下一张下一张 repaint( ); public static void main(String a) Frame m= new ShowAnimator(); m.setSize(200,200); m.setVisible(true); J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )11.2.3 GridLayout11.2.3 GridLayout布局布局 p 把容器的空间分为若干行乘若干列的网格区域p 组件按从左向右,从上到下的次序被加到各单元格中p 组件的大小将调整为与单元格大小相同。J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) GridLayout GridLayout构造方法构造方法p public GridLayout() 所有组件在一行中。所有组件在一行中。 p public GridLayout(int rows,int cols) 通过参数指定布局的行和列数。通过参数指定布局的行和列数。 p public GridLayout(int rows,int cols,int hgaps,int vgaps) 指定划分的行列数以及组件间的水平和垂直间距。指定划分的行列数以及组件间的水平和垂直间距。 add(组件名组件名) GridLayout布局布局加入组件加入组件J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) setLayout(new GridLayout(3, 3, 10, 10); for (int i = 1; i = 9; i+) add(new Button(Button # + i); 【例例11-3】 布局修改布局修改J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )思考:如何布局思考:如何布局?J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )11.2.4 CardLayout11.2.4 CardLayout布局布局 加入的部件叠成卡片的形式加入的部件叠成卡片的形式 组件加入组件加入 add(add(字符串字符串, , 组件名组件名) )其中,字符串用来标识卡片名称。其中,字符串用来标识卡片名称。构造方法构造方法 p public CardLayout() 显示组件将占满整个容器,不留边界。显示组件将占满整个容器,不留边界。 p public CardLayout(int hgap,int vgap)容器边界分别留出水平和容器边界分别留出水平和垂直间隔,组件占中央。垂直间隔,组件占中央。J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) C CardLayoutardLayout布局布局- - -卡片翻动卡片翻动 show(容器容器,字符串字符串):显示指定名称的卡片:显示指定名称的卡片 first(容器容器) :显示第一块卡片:显示第一块卡片 last(容器容器) :显示最后一块卡片:显示最后一块卡片 next(容器容器) :显示下一块卡片:显示下一块卡片 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )11.3 常用常用GUI部件部件J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) ComponentComponent类类( (抽象类)抽象类) Color getBackground() : Color getBackground() : 获取部件的背景色获取部件的背景色 Font getFont() : Font getFont() : 获获取部件的显示字体取部件的显示字体 Graphics getGraphics(): Graphics getGraphics(): 获取部件的获取部件的GraphicsGraphics属性对象属性对象 void repaint(int x,int y,int width,int height) : void repaint(int x,int y,int width,int height) : 对部对部件的特定区域进行重新绘图件的特定区域进行重新绘图 void setBackground(Color c) : void setBackground(Color c) : 设置部件的背景设置部件的背景 void setEnabled(boolean b) : void setEnabled(boolean b) : 是否让部件功能有效是否让部件功能有效 void setFont(Font f) : void setFont(Font f) : 设置部件的显示字体设置部件的显示字体 void setSize(int width,int height) : void setSize(int width,int height) : 设置部件大小设置部件大小 void setVisible(boolean b) : void setVisible(boolean b) : 设置部件是否可见设置部件是否可见 void setForeground(Color c) : void setForeground(Color c) : 设置部件的前景色设置部件的前景色 void requestFocus() : void requestFocus() : 让部件得到焦点让部件得到焦点 void add(PopupMenu popup) void add(PopupMenu popup) :给部件加入弹出菜单:给部件加入弹出菜单 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )1. 文本框只能编辑一行数据文本框只能编辑一行数据构造方法有四种构造方法有四种: TextField():构造一个单行文本输入框。:构造一个单行文本输入框。 TextField(int):指定长度的单行文本输入框。:指定长度的单行文本输入框。 TextField(String):指定初始内容的单行文本输入框。:指定初始内容的单行文本输入框。 TextField(String, int):指定长度、指定初始内容。:指定长度、指定初始内容。 tf1 = new TextField(); tf2 = new TextField(, 20); tf3 = new TextField(Hello!); tf4 = new TextField(Hello, 30); 11.3.2 文本框与文本域文本框与文本域J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )2. 2. 文本域文本域(TextArea)(TextArea)特点特点1:可以编辑多行文字:可以编辑多行文字 构造方法有四种构造方法有四种: TextArea( ):构造一个文本域。 TextArea(int, int):构造一个指定长度和宽度的文本域。 TextArea(String):构造一个显示指定文字的文本域。 TextArea(String, int, int):按指定长度、宽度和默认值构造文本域。 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )常用方法常用方法: setEchoChar(*) 设置回显字符设置回显字符 getText( ) :获取输入框中的数据:获取输入框中的数据 setText( ) :往输入框写入数据:往输入框写入数据 isEditable( ):判断输入框是否可编辑。:判断输入框是否可编辑。 void select(int start,int end):选定由开始和结束位置指选定由开始和结束位置指定的文本。定的文本。void selectAll( ):选定所有文本。选定所有文本。3文本部件的常用方法文本部件的常用方法 以下方法只限于文本域以下方法只限于文本域append(String s):将字符串添加到文本域的末尾 insert(String s,int index):将字符串插入到文本域的指定位置 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )4. 4. 文本框文本框(TextField)-(TextField)-事件事件 ActionEvent事件事件-在文本框按在文本框按回车键回车键时引发时引发 注册:注册:addActionListener( ); 接口:接口:ActionListener 方法: public void actionPerformed(ActionEvent e) TextEvent事件事件-对文本输入部件数据对文本输入部件数据更改更改操作操作 (添加、修改、删除)(添加、修改、删除)注册:注册: addTextListener( )接口:接口:TextListener方法:方法: public void textValueChanged(TextEvent e) J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 练习练习: :验证密码域只能输入数字字符验证密码域只能输入数字字符public void textValueChanged(TextEvent e) String s = pass.getText(); char last=s.charAt(s.length()-1); if (! Character.isDigit(last) hint.setText(只能是数字,重输:只能是数字,重输:); pass.setText(); J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 【例例11-7】在图形界面中,安排一个文本框和文本域。在图形界面中,安排一个文本框和文本域。将文本框键入字符同时显示在文本域中。将文本框键入字符同时显示在文本域中。 import java.applet.*;import java.awt.*;import java.awt.event.*;public class TextIn extends Frame implements TextListener,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);J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) tf.addActionListener(this); public void textValueChanged(TextEvent e) String s = tf.getText( ); ta.setText(pre+s); /更新文本域内容更新文本域内容 public void actionPerformed(ActionEvent e) tf.setText(); /清空文本框清空文本框 ta.append(n); /添加一个换行符添加一个换行符 pre= ta.getText( ); public static void main(String a) . /创建窗体创建窗体并可见并可见 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )11.4.1 11.4.1 鼠标事件鼠标事件 共有共有7种情形种情形,用用 MouseEvent类的同名静类的同名静态整型常量标志态整型常量标志, 分别是分别是:MOUSE_DRAGGEDMOUSE_ENTEREDMOUSE_EXITEDMOUSE_MOVED MOUSE_PRESSEDMOUSE_RELEASEDMOUSE_CLICKEDJ a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) 鼠标事件的处理接口鼠标事件的处理接口MouseListener 负责接收和处理鼠标的负责接收和处理鼠标的press(按下按下)、release(释放)、(释放)、click(点击)、(点击)、enter(移入)和(移入)和exit(移出)动作触发的事件;(移出)动作触发的事件; MouseMotionListener 负责接收和处理鼠标的负责接收和处理鼠标的move(移动移动)和和drag(拖动拖动)动作触发的事件。动作触发的事件。 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) ) MouseEventMouseEvent类类public int getX() :返回发生鼠标事件的:返回发生鼠标事件的 X坐标。坐标。 public int getY() :返回发生鼠标事件的:返回发生鼠标事件的 Y坐标。坐标。 public Point getPoint() :返回:返回 Point对象对象,也即鼠也即鼠标事件发生的坐标点。标事件发生的坐标点。 public int getClickCount() :返回鼠标点击事件:返回鼠标点击事件的连击次数。的连击次数。 J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )高级语义事件和低级语义事件高级语义事件和低级语义事件常见的低级语义事件有:常见的低级语义事件有: 组件事件(组件事件(ComponentEvent):组件尺寸的变化,移):组件尺寸的变化,移动;动; 容器事件(容器事件(ContainerEvent):容器中容器中组件组件增加,增加,移移除除; 窗口事件(窗口事件(WindowEvent):关闭窗口,图标化;):关闭窗口,图标化; 焦点事件(焦点事件(FocusEvent):焦点的获得和丢失;):焦点的获得和丢失; 键盘事件(键盘事件(KeyEvent):键按下、释放;):键按下、释放; 鼠标事件(鼠标事件(MouseEvent):鼠标单击,移动等。):鼠标单击,移动等。高级语义事件以组件为基础;例如:按钮上动作事件。低级语义事件具有更广泛性:例如:按钮上鼠标移动、点击、进入等。低级语义事件先于高级语义事件发生。J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )例例11-8 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( );#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);部署界面部署界面J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )p.add(new Label( ); / 插入一个空标签插入一个空标签p.add(pass);p.add(color);p.add(fail);p.add(back);add(“East”, p);setSize(500, 450);setVisible(true);public static void main(String args) new chessGame( );部署界面部署界面J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )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.addMouseMotionListener(new MouseMotionAdapter( ) 鼠标移动则红色小方框跟随鼠标移动则红色小方框跟随J a v aJ a v a 语 言 程 序 设 计语 言 程 序 设 计 ( ( 第第 2 2 版版 ) )public 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/