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("请输入字符!");
        }
        }
}

运行结果:

action在java的意思 java的actionevent_java

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;
    }
}