AWT/Swing——事宜处置惩罚_玖富娱乐主管发布


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

媒介

当用户点击图形界面上的一个按钮或许其他Component时要有所响应,这才是完成了图形界面的交互功用。怎样做出这些响应我们就须要相识事宜的处置惩罚机制。下面将分为以下内容引见AWT(Swing)中事宜处置惩罚机制:

甚么是事宜

浅显一点来讲就是某种状况的转变,在我们的图形界面中就表现为某个按钮被点击了,窗口被封闭了等。

甚么是事宜处置惩罚

当某个事宜发作时(界面中的某个Component的某个状况发作转变时),我们愿望在这个机遇实行一些代码来做我们愿望做的事,这个就是事宜处置惩罚。如点击窗口封闭按钮时,弹出对话框讯问用户是不是生存以后已修悛改的内容。
Java是面向工具的编程言语,Java中运用监听器类来探测一个事宜(转变),运用监听器类中的要领来在事宜发作的时刻处置惩罚事宜

事宜处置惩罚中的三要素

事宜源:是这个工具的状况转变激发的事宜,事宜源通常是Component。

事宜:事宜源发作的状况转变。如按钮被鼠标左击或许被鼠标右击等。

事宜监听器:监听器被安装在某个Component上,卖力监听这个Component详细状况被转变了。

AWT中事宜处置惩罚的流程

外部诱使事宜源状况发作变化,发生事宜工具,然后事宜监听器监听到该事宜的发作,做出响应。

  1. 首先将事宜监听器注册到事宜源上面
  2. 触发事宜源上的事宜(转变状况)
  3. 天生事宜工具
  4. 事宜监听器监听到该事宜的发作,天生的事宜工具当作参数传入事宜处置惩罚器(监听器类中的要领)
  5. 挪用事宜处置惩罚器做出响应

举例点击事宜

鼠标点击按钮后,文本框中显现一行‘按钮被点击了'。

先是在按钮上注册了事宜监听器,监听器中设置鼠标被点击时应当挪用的事宜处置惩罚器是怎样处置惩罚的;然后,鼠标点击按钮;天生按钮被点击的事宜工具;事宜监听器监听到点击事宜发作,就会传入事宜工具到事宜处置惩罚器;末了,挪用事宜处置惩罚器中做出愿望的响应。

public class TestEvent {
    public static void main(String[] args) {
        JFrame myFrame = new JFrame();
        JButton btn = new JButton("点击我");
        JTextField field = new JTextField();
        //为field指定宽高
        field.setPreferredSize(new Dimension(100, 40));
        //运用Jpanel容器装载JButton和JTextFiedl组件
        JPanel jPanel = new JPanel();
        jPanel.add(btn);
        jPanel.add(field);
        myFrame.add(jPanel);
        //设置窗口的巨细宽高都为300像素和地位间隔屏幕左上方向右300像素和向下300像素
        myFrame.setBounds(300, 300, 300, 300);
        //必需设置这个属性 才能够瞥见窗口
        myFrame.setVisible(true);
        
        //为btn设置事宜监听器 监听器接纳匿名内部类的情势
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                field.setText("Button被点击了");
            }
        });
    }
}


AWT中事宜处置惩罚的模板

class XXXXListener implements XXXListener {
    @Override 
    public void xxx(ActionEvent e) {
        System.out.println("用户单击了按钮");
    }
}
…
yyy.addXXXListener(new XXXXListener());

建立一个监听器类,该类完成监听器接口XXXListener,然后完成监听器要领使得能够处置惩罚对应事宜

  • 在感兴趣的Component上运用addXXXListener(...),增添监听器即传入监听器的实例

  • 注重:

    ​ 分歧的Component有分歧的事宜发作,然则一样平常增添监听器的要领都是addXXXListener(...)。Component会有分歧的事宜发作,以是须要对感兴趣的事宜增添对应的监听器。有些监听器内部会有多个要领,能够监听多种事宜,然则这些事宜一样平常都相干。

    在点击事宜举例中,我们增添监听器接纳的匿名内部类的情势,能够看出监听器的完成情势照样有多种。

监听器(EventListener)的完成情势

监听器是一种特别的Java类。在AWT中,监听器主要有以下几种完成体式格局:

监听器作为外部类

范例易于明白、类自身能够重用;缺乏在于一样平常情况下不利于完成事宜处置惩罚中的功用,由于不容易于接见界面中的属性和要领

class BtnListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        //运用getSource猎取事宜源工具 然则不容易接见到其他组件
        JButton btn = (JButton)e.getSource();
        btn.setText("我被点击了");
    }
}

public class TestListener {
    private JFrame myFrame = new JFrame("测试外部监听器");
    private JButton btn = new JButton("点击我");
    private JTextField field = new JTextField();
    
    //组织函数
    public TestListener() {
        init();
    }
    
    //初始化 为按钮增添事宜监听器
    public void init() {
        JPanel jPanel = new JPanel();
        jPanel.add(btn);
        field.setPreferredSize(new Dimension(100, 40));
        jPanel.add(field);
        
        //以建立外部类工具体式格局增添事宜监听器
        btn.addActionListener(new BtnListener());
        
        myFrame.add(jPanel);
        myFrame.setBounds(300, 300, 500, 300);
        //使得按钮窗口的封闭按钮能够封闭窗口
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    //显现窗口
    public void showFrame() {
        myFrame.setVisible(true);
    }
    
    public static void main(String[] args) {
        new TestListener().showFrame();
    }
}

监听器作为内部类

能够轻易的接见主类中的任何属性和要领,包孕私有要领;缺乏在于使得主类过于庞杂、不克不及够在分歧界面中重用

public class TestListener {
    //内部类
    class BtnListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            //能够轻易操作主类的其他属性
            field.setText("Btn被点击了");
        }
    }
    ...
    //初始化 为按钮增添事宜监听器
    public void init() {
        ...
        //以建立内部类工具体式格局增添事宜监听器
        btn.addActionListener(new BtnListener());
        ...
    }
    ...
}

监听器作为主类自身

能够轻易地接见本类中的任何要领和属性;缺乏在于使得本类的要领过量

//主类作为监听器
public class TestListener implements ActionListener{
    private JFrame myFrame = new JFrame("测试主类作为监听器");
    private JButton btn = new JButton("点击我");
    private JTextField field = new JTextField();
    
    //组织函数
    public TestListener() {
        init();
    }
    
    //完成的处置惩罚要领
    @Override
    public void actionPerformed(ActionEvent e) {
        field.setText("Btn被点击了");
    }
    
    //初始化 为按钮增添事宜监听器
    public void init() {
        JPanel jPanel = new JPanel();
        jPanel.add(btn);
        field.setPreferredSize(new Dimension(100, 40));
        jPanel.add(field);
        
        //主类自身作为监听器工具传入
        btn.addActionListener(this);
        
        myFrame.add(jPanel);
        myFrame.setBounds(300, 300, 500, 300);
        //使得按钮窗口的封闭按钮能够封闭窗口
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    //显现窗口
    public void showFrame() {
        myFrame.setVisible(true);
    }
    
    public static void main(String[] args) {
        new TestListener().showFrame();
    }
}

监听器作为匿名内部类

能够轻易地接见主类的要领和属性;缺乏在于关于每一个事宜都须要写匿名内部类,不克不及重用、不利于明白

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-
//主类作为监听器
public class TestListener{
    private JFrame myFrame = new JFrame("测试主类作为监听器");
    private JButton btn = new JButton("点击我");
    private JTextField field = new JTextField();
    
    //组织函数
    public TestListener() {
        init();
    }
    
    //初始化 为按钮增添事宜监听器
    public void init() {
        JPanel jPanel = new JPanel();
        jPanel.add(btn);
        field.setPreferredSize(new Dimension(100, 40));
        jPanel.add(field);
        
        //以匿名内部类的体式格局建立监听器
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                field.setText("Btn被点击了");
            }
        });
        
        //或许运用lambda表达式
//      btn.addActionListener(event->field.setText("Btn被点击了"));
        
        myFrame.add(jPanel);
        myFrame.setBounds(300, 300, 500, 300);
        //使得按钮窗口的封闭按钮能够封闭窗口
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    //显现窗口
    public void showFrame() {
        myFrame.setVisible(true);
    }
    
    public static void main(String[] args) {
        new TestListener().showFrame();
    }
}

关于运用lambda表达式的明白:若某个要领运用的类是“尽人皆知“的并且类中的要领是独一的,我们就只须要给出参数和一些实行代码替代本来庞杂的一堆代码。由于独一性,编译器就会推断出运用的是甚么类和类中的要领。
上面我们能够运用lamnda表达式event->field.setText(...)替代了匿名内部类那么多代码,那是由于编译器能够推断出addListener(...)须要传入的参数是完成了ActionListener接口的类,这个类中有独一的要领就是actionPerformed和这个要领只要一个参数并且也晓得其参数范例。

运用lambda表达式虽然能够简化我们的代码,然则我们须要理清晰其底本应当运用甚么类和甚么要领。

如果省略的要领由多个参数则->左侧的参数须要运用()括起来如(a,b,c)->后有多行须要实行的代码则运用{}将代码括起来。

事宜适配器(EventAdapter)

我们在建立监听器类时须要完成其完成的响应监听器接口中的一切要领。前面提到过,某些监听器接口内会有多个要领,然则我们只对一些要领感兴趣,有无要领只用完成感兴趣的要领其他要领就不完成呢。谜底是有的,那就是运用事宜适配器。Java内部已帮我们事前写了一些适配器,我们只须要完成感兴趣的适配器,然后重写我们感兴趣的要领。

如果没有适配器,我们想监听鼠标点击事宜,我们先看MouseListener接口的源码完成:

public interface MouseListener extends EventListener {

    /**
     * Invoked when the mouse button has been clicked (pressed
     * and released) on a component.
     */
    public void mouseClicked(MouseEvent e);

    /**
     * Invoked when a mouse button has been pressed on a component.
     */
    public void mousePressed(MouseEvent e);

    /**
     * Invoked when a mouse button has been released on a component.
     */
    public void mouseReleased(MouseEvent e);

    /**
     * Invoked when the mouse enters a component.
     */
    public void mouseEntered(MouseEvent e);

    /**
     * Invoked when the mouse exits a component.
     */
    public void mouseExited(MouseEvent e);
}

我们须要完成mouseClicked要领之外的其他4个要领,能够说是异常贫苦的。我们再看MouseAdapter的源码完成:

public abstract class MouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener {
    /**
     * {@inheritDoc}
     */
    public void mouseClicked(MouseEvent e) {}

    /**
     * {@inheritDoc}
     */
    public void mousePressed(MouseEvent e) {}

    /**
     * {@inheritDoc}
     */
    public void mouseReleased(MouseEvent e) {}

    /**
     * {@inheritDoc}
     */
    public void mouseEntered(MouseEvent e) {}

    /**
     * {@inheritDoc}
     */
    public void mouseExited(MouseEvent e) {}

    /**
     * {@inheritDoc}
     * @since 1.6
     */
    public void mouseWheelMoved(MouseWheelEvent e){}

    /**
     * {@inheritDoc}
     * @since 1.6
     */
    public void mouseDragged(MouseEvent e){}

    /**
     * {@inheritDoc}
     * @since 1.6
     */
    public void mouseMoved(MouseEvent e){}
}

能够看出适配器的完成异常奇妙,为每一个要领增添一个空的要领体而为我们举行一次封装,我们只需重写我们感兴趣的要领便可,其他要领也不会受到影响。

AWT中的事宜分类

AWT中的事宜主要分为两大类:初级事宜和高等事宜

初级事宜

初级事宜就对照底层(对照细节),主要有:

  • ComponentEvent:组件事宜,当组件尺寸发作转变、地位发作变化、显现/隐蔽状况发作转变时,就会触发该事宜

  • ContainerEvent:容器事宜,当容器里增添、删除组件时,就会触发该事宜

  • WindowEvent:窗口事宜,当窗口状况发作转变(翻开、封闭、最大化、最小化)时,就会触发该事宜

  • FocusEvent:核心事宜,当组件获得核心或许落空核心时,就会触发该事宜

  • KeyEvent:键盘事宜,当键盘按键被按下、松开时就会触发该事宜

  • MouseEvent:鼠标事宜,当一个组件被鼠标按下、摊开、在其上面挪动鼠标时,就会触发该事宜

  • PaintEvent:绘制事宜,当GUI组件挪用update()/paint()要领时触发该事宜,该事宜并不是专用于事宜处置惩罚模子中,一样平常也很少直接监听该事宜

高等事宜

高等事宜基于语义,并反目特定的行动相干,而依赖于触发该事宜的组件种别。主要分为:

  • ActionEvent:行动事宜,当按钮、菜单等能发生Action的项目被单击,或许在TextField中按下Enter按钮时,就会触发该事宜
  • AdjustmentEvent:调治事宜,在滑动条上挪动滑块调治数值时触发该事宜
  • ItemEvent:–选项事宜,当在有许多项目的组件中,选中或许作废选中了某一个项目,就会触发该事宜
  • TextEvent:文本事宜,当文本框或许文本域这类具有文本的组件中,文本发作变化时,就会触发该事宜

小结

总结了关于事宜处置惩罚的大部分基本,基本观点有了,主要的照样多写代码实践。别的事宜处置惩罚中照样涉及到许多技能,好比运用lambda表达式、运用设想形式的适配器思想去简化设置监听器的代码。在本身写的过程当中才会体味更多

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。