a# 四:处理事件
1:事件处理模式
1:事件源
能够产生事件的对象都可以称为事件源,例如文本框,按钮等。这个对象必须是Java能够认为可以产生事件的对象。
2:监视器
需要对一个事件源进行监视,以便对发生的事件做出处理,事件源调用对应的方法注册自己的监视器。
3:处理事件的接口
Java规定为了让监视器这个对象对事件源发生的事件进行处理,创建该监视器对象的类必须实现响应的接口。即必须在类体中实现相应的方法。也就是监视器必须和一个初始事件的方法绑定。
2:ActionEvent事件
1:ActionEvent事件源
文本框、按钮、菜单、密码框、单选按钮均会触发ActionEvent事件,例如文本框,当获得事件焦点后,点击回车,java就会调用ActionEvent类创建一个对象。
2:注册监视器
能够触发ActionEvent事件的组件可以调用方法addActionEvent(ActionListener listener)
方法来注册一个监视器。其中ActionListener是一个接口。
3:ActionListener接口
此接口中含有一个方法:actionPerformed(ActionEvent e)
该方法是对事件进行处理的方法。其中参数e就是刚开始创建的对象。
4:ActionEvene类中的方法。
(1):public Object getSource()
该方法是从Event继承的方法,作用获取发生事件事件源的对象的引用。
(2):public String getActionCommand()
作用为获取与发生事件相关的“命令”,例如文本框就是获取其中的内容。
例如:
Test_Mian.java
public class Test_main {
public static void main(String[] args) {
WindowActionEvent win=new WindowActionEvent();
win.setTitle("Hello");
win.setBounds(500,500,600,800);
}
}
WindowActionEvent.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
public class WindowActionEvent extends JFrame {
JTextField text;
ActionListener listener; //定义一个接口型的变量
public WindowActionEvent(){
setLayout(new FlowLayout());
text=new JTextField(10);
add(text);
listener=new ReaderListener(); //readerlistener类实现了接口Actionlisener
text.addActionListener(listener);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
ReaderListener.java
import java.awt.event.*;
public class ReaderListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) { //接口中的唯一方法实现事件的处理
String str=e.getActionCommand(); //获取文本框的内容
System.out.println(str+":"+str.length());
}
}
3:ItemEvent事件
1:ItemEvent事件源
选择框和下拉框可以触发事件ItemEvent事件,当选择状态由选中到未选中就触发事件ItemEvent事件。对于下拉列表,下拉选择其中一项就触发事件ItemEvent
2:注册监视器
能出发此事件的组件调用addItemListener(ItemListener listen)将实现ItemLisrner接口类的实例作为监听器。
3:ItemListener接口
该接口只包含一种方法:public void ItemStateChanged(ItemEvent e)
用来处理监听到事件的处理操作。
ItemEvent事件对象调用getsourse()方法返回事件源,亦可以使用getItemSelectable()返回发生ItemEvent事件的事件源。
例如:
Test_Main.java
public class Test_Main {
public static void main(String[] args) {
WindowOperation win=new WindowOperation();
win.setBounds(100,100,400,400);
win.setTitle("简单计算器");
}
}
WindowOperation.java 界面的设计及初始化
import javax.swing.*;
import java.awt.*;
import java.io.*;
public class WindowOperation extends JFrame {
JTextField inputNumberOne,inputNumberTwo;
JComboBox choiceFuhao;
JTextArea textShow;
JButton jButton;
OperationListener operationListener; //这个对象实现了接口ItemListener
ComputerListener computerListener;
public WindowOperation(){
init();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void init(){
setLayout(new FlowLayout());
inputNumberOne=new JTextField(5);
inputNumberTwo=new JTextField(5);
choiceFuhao=new JComboBox();
jButton=new JButton("计算");
choiceFuhao.addItem("选择运算符号");
String [] a={"+","-","*","/"};
for(int i=0;i<a.length;i++){
choiceFuhao.addItem(a[i]);
}
textShow=new JTextArea(9,30);
operationListener=new OperationListener();
computerListener=new ComputerListener();
operationListener.setJComboBox(choiceFuhao);//与监听器绑定
operationListener.setWorkTogether(computerListener);
computerListener.setjTextFieOne(inputNumberOne);
computerListener.setJTextFieTwo(inputNumberTwo);
computerListener.setjTextArea(textShow);
choiceFuhao.addItemListener(operationListener);
jButton.addActionListener(computerListener);
add(inputNumberOne);
add(choiceFuhao);
add(inputNumberTwo);
add(jButton);
add(textShow);
}
}
OperationListener.java
//itemEvent监听器事件的处理
import javax.swing.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class OperationListener implements ItemListener {
JComboBox choice;
ComputerListener workTogether;
public void setJComboBox(JComboBox box) {
choice = box;
}
public void setWorkTogether(ComputerListener computer) {
workTogether = computer;
}
@Override
public void itemStateChanged(ItemEvent e) {
String fuhao=choice.getSelectedItem().toString();
workTogether.setFuhao(fuhao);
}
}
ComputerListener.java
//ActionEvent监听器
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ComputerListener implements ActionListener {
JTextField inputNumberOne,inputNumberTwo;
JTextArea textShow;
String fuhao;
public void setjTextFieOne(JTextField t) {
inputNumberOne = t;
}
public void setJTextFieTwo(JTextField t){
inputNumberTwo=t;
}
public void setjTextArea(JTextArea Area) {
textShow = Area;
}
public void setFuhao(String s) {
fuhao = s;
}
@Override
public void actionPerformed(ActionEvent e) {
try{
double number1=Double.parseDouble(inputNumberOne.getText());
double number2=Double.parseDouble(inputNumberTwo.getText());
double result=0;
if(fuhao.equals("+")){
result= number1+number2;
}
else if(fuhao.equals("-")){
result=number1-number2;
}
else if(fuhao.equals("*")){
result=number1*number2;
}
else if(fuhao.equals("/")){
result=number1/number2;
}
textShow.append(number1+" "+fuhao+" "+number2+"="+result+"\n");
}
catch (Exception exp)
{
textShow.append("请输入字符!");
}
}
}
运行结果:
DocumentEvent事件
1:DocumentEvent事件源
每个文本区存在一个实现了接口Document的实例,被称为文本区所维护的文档。而此文档可以触发事件DocumentEvent(此类不在java.awt.eventr而是在javax.swing.event)。换句话就是当文本区内容被读者修改是,就会触发此事件。
2:注册监视器
能触发DocumentEvent事件的事件源调用addDocumentListener(DocumentListener listen)
实现将实现接口——DocumentListener接口的类的实例作为其监听器。
3:DocumentListener接口
此接口含有三个方法:
public void changedUpdate(DocumentEvent e) //给出属性或属性集发生了更改的通知。
public void removeUpdate(DocuemntEvent e) //给出移除了一部分文档的通知。
public void insertUpdate(DocuemntEvent e) //给出对文档执行了插入操作的通知。
例如:
Test_Main.java
public class Test_Main {
public static void main(String[] args) {
WindowDocument win=new WindowDocument();
win.setBounds(100,100,800,600);
win.setTitle("Document事件练习");
}
}
WindowDocument.java
import javax.swing.*;
import java.awt.*;
public class WindowDocument extends JFrame {
JTextArea inputText,showText;
JMenuBar jMenuBar; //声明一个菜单条变量
JMenu jMenu; //声明一个菜单变量
JMenuItem itemCopy,itemCut,itemPaste; //菜单内容有复制、剪切,以及粘贴。
TextListener textChangeListenner; //inpute文本框的监听器
HandleListener handleListener; //复制。。。控件的监听器
WindowDocument(){
init(); //初始化函数
setLayout(new FlowLayout()); //设置窗口布局流失布局
setVisible(true); //窗口可见
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
void init(){ //对基本组件进行初始化
inputText=new JTextArea(15,20); //文本区15行20列
showText=new JTextArea(15,20);
showText.setLineWrap(true); //设置文本区可以自动换行
showText.setWrapStyleWord(true); //文本区以单词为界自动换行
jMenuBar=new JMenuBar();
jMenu=new JMenu("编辑");
itemCopy=new JMenuItem("复制(C)");
itemCut=new JMenuItem("剪切(T)");
itemPaste=new JMenuItem("粘贴(P)");
itemCopy.setAccelerator(KeyStroke.getKeyStroke('c')); //设置快捷方式
itemCut.setAccelerator(KeyStroke.getKeyStroke('t'));
itemPaste.setAccelerator(KeyStroke.getKeyStroke('P'));
itemCopy.setActionCommand("copy"); //设置copy的命令给选项复制
itemCut.setActionCommand("cut");
itemPaste.setActionCommand("paste");
jMenu.add(itemCopy); //将菜单项添加到菜单中
jMenu.add(itemCut);
jMenu.add(itemPaste);
jMenuBar.add(jMenu);
setJMenuBar(jMenuBar);//将菜单添加到菜单条
add(new JScrollPane(inputText)); //将两个本文框放到面板中一起加入到窗口中
add(new JScrollPane(showText));
textChangeListenner=new TextListener();
handleListener=new HandleListener();
textChangeListenner.setInputText(inputText); //将输入文本传递给监听器中
handleListener.setShowText(showText);
(inputText.getDocument()).addDocumentListener(textChangeListenner); //给文本维护文档注册监听器
itemCopy.addActionListener(handleListener); //给菜单项注册监听器
itemCut.addActionListener(handleListener);
itemPaste.addActionListener(handleListener);
}
}
TextListener.java
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.lang.reflect.Array;
import java.util.Arrays;
//实现DocumentListener的实例,即监听器的实现
public class TextListener implements DocumentListener {
JTextArea inputText,showText;
public void setInputText(JTextArea text){ //接受从WindowDocument传递过来的参数
inputText=text;
}
public void setShowText(JTextArea text) {
showText=text;
}
@Override
public void insertUpdate(DocumentEvent e) {
changedUpdate(e); //覆盖原有信息
}
@Override
public void removeUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void changedUpdate(DocumentEvent e) {
String str=inputText.getText();
String regex="[\\s\\d\\p{Punct}]+"; //空格符号和数字组成的正则表达式
String words[]=str.split(regex);
Arrays.sort(words); //按照字典序排序
showText.setText(null); //初始化为空
for(int i=0;i<words.length;i++){
showText.append(words[i]+",");
}
}
}
HandleListener.java
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//菜单项监听器
public class HandleListener implements ActionListener {
JTextArea inputText,showText;
@Override
public void actionPerformed(ActionEvent e) {
String str=e.getActionCommand(); //获取文本框的“命令”如果为copy完成复制调用copy....
if(str.equals("copy")){
showText.copy(); //调用复制
}
else if(str.equals("cut")){
showText.cut();
}
else if(str.equals("paste"))
{
inputText.paste();
}
}
public void setShowText(JTextArea text) {
showText=text;
}
public void setInputText(JTextArea inputText) {
this.inputText = inputText;
}
}