java语言程序设计 李尊朝 典型例题解析
例11-1 编写一个程序,在屏幕上显示带标题的窗口,并添家一个按钮。当用户单按钮时,结束程序
解析:
具有事件处理功能的GUI程序需要导入java.awt和java.awt.event包中的所有类,并定义一个继承Frame的类,定义组件,为组件注册事件监听器,实现覆盖监听器接口或适配器类中的方法,进行事件处理。
本例中,定义了一个Button 组件quit,quit的监听器是实现ActionListener接口的FirstFrame类对象this.FirstFrame实现了ActionListener接口中的ActionPerformed()方法,其功能是结束程序运行。
package typicalExamples11_1; import java.awt.*; import java.awt.event.*; public class FirstFrame extends Frame implements ActionListener { private Button quit=new Button("退出"); public FirstFrame() { super("First Window"); add(quit); quit.addActionListener(this); setSize(250, 80); setVisible(true); } public void actionPerformed(ActionEvent e) { System.exit(0); } public static void main(String args[]) { FirstFrame ff = new FirstFrame(); } }
例11-2 编写一个窗口程序,窗口中有两个按钮和一个文本行。当单击第一个按钮时,结束程序运行:当单击第二个按钮时,文本行显示该按钮被单击的次数。
解析:
定义Button组件quit和click及TextField 组件txf。quit和click的监听器都是实现ActionListener接口的ClickButton类对象this.ClickButton实现了ActionListerner
接口中的actionPerformed()方法。在actionPerformed()中,通过getSource()方法判断引起ActionEvent事件的事件源。如果事件源是quit,结束程序运行:如果事
件源是click,首先给count变量的值加1,再在txf文本行中显洋count的值,即click被单击的次数。
package typicalExamples11_2; import java.awt.*; import java.awt.event.*; public class ClickButton extends Frame implements ActionListener { private Button quit=new Button(" 退出 "); private Button click=new Button(" 单击 "); private TextField txf=new TextField(" 还未单击按钮 "); private int count=0; public ClickButton() { super("Click Button"); setLayout(new FlowLayout()); add(quit); add(click); add(txf); quit.addActionListener(this); click.addActionListener(this); setSize(250, 100); setVisible(true); } public void actionPerformed(ActionEvent e) { if (e.getSource()==quit) System.exit(0); else if (e.getSource()==click) { count++; txf.setText("单击了"+Integer.toString(count)+"次"); } } public static void main(String args[]) { ClickButton cb = new ClickButton(); } }
例11-3 编写一窗口程序,实现以下功能:
当用户按下q键或单击窗口关闭按钮时,结束程序运行;当用户按其字符键时,在屏幕上显示被按下的字符。
解析:
要对键盘按键响应,需要对KeyEvent事件监听。KeyEvent事件监听器是实现KeyListener接口的类对象,该类要实现KeyListener接口中的抽象方法
keyPressed()、keyreleased()和keyTyped().
要关闭窗口,需要对windowevent事件监听。windowsevent事件监听器是实现windowListener接口的类对象,该类要实现windowlistener接口中的抽象方法
windowClosing()、windowclosed()、windowDeactivated()、windowsActivated()、windowIconified()、windowDeiconified()和windowOpend().
本例中,内部keyhandler实现Keylistener接口,并实现其中的抽象方法KEYpressed()、keyReleased()和keyTyped().keyhandler的对象担任keyevent事件的监
听器。外部类windowHandler实现windowsListener接口,并实现其中的7个抽象方法。windowsHandler的对象handler担任windowsEvent事件的监听器。
监听器所属类可定义为内部类(如 keyHandler)、外部类(如 windowHandler)或匿名类。其效果相同。监听器所属类不需要构造方法。
package typicalExamples11_3; import java.awt.*; import java.awt.event.*; public class MultiEvent extends Frame { private WindowHandler handler=new WindowHandler(); public MultiEvent() { super("MultiEvent"); setLayout(new FlowLayout()); addKeyListener(new KeyHandler()); addWindowListener(handler); setSize(250, 100); setVisible(true); } public static void main(String args[]) { MultiEvent me = new MultiEvent(); } class KeyHandler implements KeyListener { public void keyPressed(KeyEvent e) { if (e.getKeyChar()=='q') System.exit(0); } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { System.out.println(e.getKeyChar()+ "is pressed!"); } } } class WindowHandler implements WindowListener { public void windowClosing(WindowEvent e) { System.exit(0); } public void windowClosed(WindowEvent e) { } public void windowActivated(WindowEvent e) { } public void windowDeactivated(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { } }
例11-4 编写一个窗口程序,包含一个文本行、两个按钮和一个文本区。当用户单击第一个按钮时,将文本行中的文本添加到文本区;当用户单击第一个按钮时,添加一个换行符后,将文本行中的文本添加到文本区。
解析:
要对第一个按钮add和第二个按钮addln的单击操作(触发ActionEvent事件)进行响应,要对其注册ActionEvent事件监听器。事件监听器由实现ActionListener接口的texts类对象this担任。text类实现了ActionListener接口中的actionPerformed()方法。在actionPerformed()方法中,通过getSource()获得事件源。如果事件源是add,仅将文本行txf中的文本添加到文本区txa中;如果事件源是addln,首先在txa添加一个换行符,再将txf中的文本添加到txa中。
要对窗口关闭操作进行响应对其注岫windowEvent事件监听器,事件监听器由继承windowsAdapter适配器类的内部类WindowHandler的对象提任。windowsHandler覆盖了windowAdapter中的windowclosing()方法,用户单击窗口关闭按钮时,结束程序运行。
为了使窗口内组件排列整齐、美观、程序中使用了面板Panel组件pal。类似Frame,Panel也是一种容器类,可以馈含button、TextField和list等组件,可以设置版面。将其他组件放入Panel组件后,再将Panel组件嵌入窗口,易于实现窗口内组件的合理布局。
package typicalExamples11_4; import java.awt.*; import java.awt.event.*; public class Texts extends Frame implements ActionListener { private TextField txf=new TextField(); private TextArea txa=new TextArea(); private Button add=new Button("Add"); private Button addln=new Button("AddLn"); public Texts() { super("Texts"); Panel pal=new Panel(); pal.setLayout( new BorderLayout()); pal.add(add,BorderLayout.WEST); pal.add(txf,BorderLayout.CENTER); pal.add(addln,BorderLayout.EAST); setLayout(new BorderLayout()); add(pal,BorderLayout.NORTH); add(txa,BorderLayout.CENTER); add.addActionListener(this); addln.addActionListener(this); addWindowListener(new WindowHandler()); setSize(300, 200); setVisible(true); } public static void main(String args[]) { Texts me = new Texts(); } public void actionPerformed(ActionEvent e) { if (e.getSource()==add) txa.append(txf.getText()); else if (e.getSource()==addln) txa.append("\n"+txf.getText()); } class WindowHandler extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } }