(96)GUI:鼠标事件、键盘事件、按钮事件、窗体事件

布局管理器:
容器中的组件的排放发生,就是布局。
常见而定布局管理器:
这里写图片描述
BorderLayout:若没有指定方向,则填充整个容器
创建图形化界面步骤:
1,创建frame窗体
2,对窗体进行基本设置,比如大小、位置、布局
3,定义组件
4,将组件通过窗体的add方法添加到窗体中
5,让窗体显示,同过setVisible(true)

事件监听机制:
这里写图片描述
特点:事件源、事件、监听器、事件处理
事件源:就是awt包或者swing包中的那些图形界面组件
事件:每一个事件源都有自己特有的而对应事件和共性事件
监听器:将可以触发某个事件的动作(不止一个)都已经封装到了监听器中。
以上三者,在java中都已经定义好了。编程人员可做的就是对产生的动作进行处理。

①Window类中public void addWindowListener(WindowListener l):添加指定的窗口监听器,以从此窗口接收窗口事件(为窗体注册监听器)。
②WindowListener:接口,内部有六个抽象方法(接口中全是抽象方法,不用显式写)。
但是平时程序开发并不需要将这六个全部实现,可以在“所有已实现的接口”类中寻找实现的子类 WindowAdapter(在Java.awt.event包中)。
③WindowAdapter:它实现了其父类的6个方法,但是其方法内部为空{},因为其方法的方法体全为空,所以创建对象没有意义,所以定义成了抽象类,该类的作用,就是让其他类继承该类。

import java.awt.*;
public class demo {

    public static void main(String[] args) {

        Frame f=new Frame("my awt");

        f.setSize(500, 400);
        f.setLocation(300, 200);
        f.setLayout(new FlowLayout());
        Button b=new Button("我是按钮");
        f.add(b);//将按钮和窗体相结合
        f.addWindowListener(new MyListener());//窗体注册监听器
        f.setVisible(true);
    }

}

import java.awt.event.*;

public class MyListener extends WindowAdapter {

    public  void windowClosing(WindowEvent e) {
        System.out.println("我关");
        System.exit(0);
    }
    public void windowActivated(WindowEvent e) {
        System.out.println("我活了哈哈");//窗体前置
    }
    public void windowOpened(WindowEvent e) {
        System.out.println("我被打开了");
    }

}

若只是实现一个方法,就创建一个类,比较麻烦,可以写匿名内部类

f.addWindowListener(new WindowAdapter() {
            public  void windowClosing(WindowEvent e) {
                System.out.println("我关");
                System.exit(0);
            }

        });

这里写图片描述

其实在实际开发中,要将要做的窗体以及里面的控件等封装成类,在main中只做测试

import java.awt.*;
import java.awt.event.*;
public class FrameDemo {

    //定义该图形中所需要的组件的引用
    private Frame f;
    private Button but;
    FrameDemo(){
        init();
    }
    public void init() {
        f=new Frame("my frame");

        //对frame进行基本设置
        f.setBounds(300, 100, 600, 500);
        f.setLayout(new FlowLayout());

        but=new Button("我的按钮");

        //将组件添加到frame中
        f.add(but);

        //加载一下窗体事件
         myEvent();

         //显示窗体
         f.setVisible(true);


    }

    public void myEvent() {

        f.addWindowListener(new WindowAdapter() {
            public  void windowClosing(WindowEvent e) {
                System.out.println("我关");
                System.exit(0);
            }
        });
    }
}

按钮事件
需求:让按钮具备退出程序的功能
按钮是事件源,应该选择哪个监听器呢?
通过关闭窗体示例了解到,想要知道哪个组件具备什么样的特有监听器,需要查看该组件对象的功能。通过查阅Button的描述,发现按钮支持一个特有监听public void addActionListener(ActionListener l)
ActionListener:是个接口,内部只含一个方法:void actionPerformed(ActionEvent e)

        but.addActionListener(new ActionListener()//只要是点击按钮就能触发该事件 
        {
            public void actionPerformed(ActionEvent e) {

                System.out.println("action OK");

            }
        });

鼠标事件是所有组件的共性事件,所以它定义在Component中:public void addMouseListener(MouseListener l)
MouseListener是个接口,因为其方法较多,所以有适配器MouseAdapter,创建匿名内部类方便

but.addMouseListener(new MouseAdapter() {
            private int count=1;
            private int clickCount=1;
            public void mouseEntered(MouseEvent e) {

                System.out.println("鼠标进入组件(按钮)"+count++);

            }
            public void mouseClicked(MouseEvent e) {
                if(e.getClickCount()==2)
                       System.out.println("点击动作"+clickCount);
            }
        });

↑ 鼠标双击事件:属于鼠标事件,只是鼠标两次点击触发的事件,在MouseEvent类中有方法:public int getClickCount()返回与事件关联的鼠标单击次数【这个次数是在两次时间间隔很短的情况下发生的才会获取为2次,时间长则为1次】

键盘事件

char getKeyChar( ):返回与此事件中的键关联的字符
int getKeyCode( );返回与此事件有关的整数keyCode
该类中提供了常量字段,方便操作键盘,比如KeyEvent.VK_ENTER就是enter的整数值,不用再通过getKeyCode获取了。

1)需求:按键盘enter实现窗体退出

but.addKeyListener(new KeyAdapter() {

            public void keyPressed(KeyEvent e) {


                if((e.getKeyCode()==KeyEvent.VK_ENTER))
                     System.exit(0);


            }
        });

2)需求:通过按ctrl+enter来退出窗体
这里写图片描述

在Java.awt.event.InputtEvent中有方法:public boolean isControlDown():判断ctrl是否按下。
因为KeyEvent继承了InputtEvent,所以KeyEvent可以直接用这个方法(keyevent并没有进行覆盖操作)

but.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if(e.isControlDown()&&(e.getKeyCode()==KeyEvent.VK_ENTER))
                     System.exit(0);

            }
        });
    }

3)需求:向文本框中输入0-9,其他输入都非法,不会输入到文本框中
InputEvent类中public void consume()使用此事件,以便不会按照默认的方式由产生此事件的源代码来处理此事件。
(比如文本框监听键盘按下,默认输入到文本框,非法字符不输入到文本框中(非默认方式consume))
private TextField tf;
f.add(tf);

tf.addKeyListener(new KeyAdapter() {

            public void keyPressed(KeyEvent e) {

                int code=e.getKeyCode();
                if(code>=KeyEvent.VK_0&&code<=KeyEvent.VK_9)
                    e.consume();
            }

        });
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
按钮事件监听是指在用户点击按钮时,程序能够捕捉到该事件,并执行相应的操作。在开发界面交互性较强的应用程序时,通常需要使用按钮事件监听来实现用户与程序之间的交互。具体实现方式有多种,例如在按钮上添加点击事件监听器,或者使用响应式编程框架中的观察者模式等。 在Java Swing中,可以使用ActionListener接口来实现按钮事件监听。下面是一个简单的示例代码: ``` import javax.swing.*; import java.awt.event.*; public class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "Button clicked!"); } } public class Main { public static void main(String[] args) { JFrame frame = new JFrame("Button Listener Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton button = new JButton("Click me!"); button.addActionListener(new ButtonListener()); frame.getContentPane().add(button); frame.pack(); frame.setVisible(true); } } ``` 在上面的代码中,我们创建了一个JButton和一个实现了ActionListener接口的ButtonListener类。当用户点击按钮时,程序会调用ButtonListener类的actionPerformed方法,并在对话框中显示一个消息。最后,我们将按钮添加到窗口中,并显示窗口。 除了Java Swing之外,其他GUI框架也都提供了类似的事件监听机制,开发人员可以根据具体需要选择相应的实现方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值