Java-JUI编程-Lesson2

发布时间 2023-11-13 22:24:22作者: 回忆也交给时间

一.事件监听

一.ActionListener类

所为事件监听,即在窗口发生事件后需要做出对应的操作,常见的事件,鼠标点击事件,失去焦点事件等等,当这些事件发生以后需要相应的自定义操作发生;

怎么判断出现了事件了,就需要用到事件监听,当事件发生就会调用绑定的方法类,然后实现自定义操作

需要实现的接口:

ActionListener

 

实现此接口有一个默认方法需要重写,也是监听事件发生后需要执行的自定操作

public void actionPerformed(ActionEvent e) {
        System.out.println("被点击了");
    }

 

然后是实现的main函数,构建一个窗口,内置一个button按钮点击后,后端的控制台输出“被点击了”字符

代码:

public class MyActionLister {
    public static void main(String[] args) {
        //窗口,全局唯一,并且基于
        Frame frame = new Frame();
        Button button = new Button();
        DefineActionListener listener = new DefineActionListener();
        button.addActionListener(listener);
        frame.add(button, BorderLayout.CENTER);
        frame.setSize(200,200);
        frame.setLocation(400,300);
        windowClose(frame);
        frame.setVisible(true);
    }


    //关闭窗口事件
    private static void windowClose(Frame frame) {
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

class DefineActionListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("被点击了");
    }
}

对于同一个监听事件,被多个事件(按钮)绑定的实现

被公用的事件方法:

  public void actionPerformed(ActionEvent e) {
        //获得事件发生的名称,如button点击事件,会获取到button的名称
        System.out.println("被点击的的信息:"+e.getActionCommand());
    }

 

在窗口中创建两个按钮,都使用这个方法,点击以后输出当前的按钮备注名

代码:

public class SecondAction {
    public static void main(String[] args) {
        Frame frame = new Frame("开始-停止");
        Button button1 = new Button("start_click");
        Button button2 = new Button("stop_click");
        MyPrintName name = new MyPrintName();
        button1.addActionListener(name);
        button2.addActionListener(name);
        button1.setActionCommand("开始_click");
        frame.add(button1,BorderLayout.NORTH);
        frame.add(button2,BorderLayout.SOUTH);
        frame.setLocation(300,300);
        frame.setSize(400,400);
        windowClose(frame);
        frame.setVisible(true);
    }
    //窗口监听
    private static void windowClose(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}
//事件监听
class MyPrintName implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        //获得事件发生的名称,如button点击事件,会获取到button的名称
        System.out.println("被点击的的信息:"+e.getActionCommand());
    }
}

 

通过 setActionCommand可以更改默认的事件备注名

WindowListener

 

WindowListener是窗口监听器,它是Frame级别的可以控制窗口的开关

ActionListener

ActionListener是事件监听器,它控制事件发生后调用用户自定义操作

 二.TextField对象

TextField对象是单行文本框对象,会将窗口上的文本内容作为一些资源对象,返回到ActionListener事件监听器方法中

可以通过getText()或setText()方法来拿到在文本,或者设置当前窗口上的TextField对象的内容

field.setEchoChar(char c);

 

设置窗口的输入显示为 ' C ' 字符,等同于将显示的输入替换为字符 “C”,但是后台接收的参数不会被替换,是原数据

e.getSource();

 

事件监听的方法返回参数为 ActionEvent :活动事件,通过活动事件中可以拿到一个对象,他就是TextField,通过e.getSource()方法拿到

此对象内部就有窗体的文本内容

field.setText(String s);

 

设置TextField对象的初始值

小案例,后台输出窗口输入的文本:

代码:

//启动类
public class TestTextField {
    public static void main(String[] args) {
        new MyFrame();
    }
}

class MyFrame extends Frame{
    public MyFrame(){
        TextField field = new TextField();
        add(field);
        TextListener listener = new TextListener();
        field.addActionListener(listener);
        field.setEchoChar('#');//将文本框对象显示为 '#'
        setLocation(300,300);
        setSize(300,250);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        setVisible(true);
    }
}

class TextListener implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        TextField o =(TextField) e.getSource();//获得一些资源
        System.out.println(o.getText()); //获得资源中的文本内容
        o.setText(""); //每次执行此方法后,置空文本对象
    }
}

拓展:

计算器的简单实现:

 代码:

public class TestCalculator {
    public static void main(String[] args){
        new MyCalculator().loading();
    }
}

class MyCalculator extends Frame{

    TextField num1;
    TextField num2;
    TextField num3;
    public void loading(){
        num1=new TextField(10);
        num2=new TextField(10);
        num3=new TextField(20);

        Button button = new Button("=");
        button.addActionListener(new MyCalculatorListener());
        Label label = new Label("+");

        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);
        setLocation(500,500);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        pack();
        setVisible(true);
    }
    private class MyCalculatorListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            int n1=Integer.parseInt(num1.getText());
            int n2=Integer.parseInt(num2.getText());
            num3.setText(""+(n1+n2));
            num2.setText("");
            num1.setText("");
        }
    }

}

二.画笔 

一.paint

画笔就好比现实生活中的一个笔,一支笔可以再一张纸上画很多东西,再Java中paint画笔也可以做到,它把Frame窗口作为一张纸,可以对这支笔进行颜色,形状,大小,位置等自定义,然后画在Frame上

 paint的操作有很多,它可以根据时间帧来画不通的图形和显示位置,这就使得画笔可以实现页面动起来的效果

画笔是Frame类的一个默认方法,我们使用的时候需要重写这个方法

 @Override
    public void paint(Graphics g) {
        super.paint(g);
    }

 

这里的g就是画笔对象,使用它可以对画笔的当前颜色更改,如更改画笔为红色 :

g.setColor(Color.red);

选择需要画的形状,如矩形,这四个参数分别是,出现位置的x,y轴,以及矩形的长,宽:

g.fillRect(100,50,100,100);

代码:

    //在frame上画一个矩形和一个圆
public void paint(Graphics g) {
        g.setColor(Color.red);
        g.fillRect(100,50,100,100);
        g.setColor(Color.MAGENTA);
        g.fillOval(300,200,50,50);
    }

 二.鼠标事件

鼠标事件是发生在鼠标上的动作,结合监听器,对鼠标发生的动作来实现用户自定义的操作

这些事件都可以被绑定到页面上的元素上,以便在事件发生时执行相应的操作或函数

鼠标的事件都在继承MouseAdapter,这是适配器模式,可以选用一个事件重写

如果直接实现mouseListener需要重写所有方法,所以使用适配器模式更高效

       //鼠标单击事件
       @Override
        public void mouseClicked(java.awt.event.MouseEvent e) {

        }
        //鼠标释放
        @Override
        public void mouseReleased(java.awt.event.MouseEvent e) {
            super.mouseReleased(e);
        }
        //鼠标进进事件,进入新的事件
        @Override
        public void mouseEntered(java.awt.event.MouseEvent e) {
            super.mouseEntered(e);
        }
        //鼠标离开事件
        @Override
        public void mouseExited(java.awt.event.MouseEvent e) {
            super.mouseExited(e);
        }
        //鼠标滚轮滚动事件
        @Override
        public void mouseWheelMoved(MouseWheelEvent e) {
            super.mouseWheelMoved(e);
        }
        //鼠标拖动事件
        @Override
        public void mouseDragged(java.awt.event.MouseEvent e) {
            super.mouseDragged(e);
        }
        //鼠标移动事件
        @Override
        public void mouseMoved(java.awt.event.MouseEvent e) {
            super.mouseMoved(e);
        }
        //鼠标按下事件
        @Override
        public void mousePressed(java.awt.event.MouseEvent e) {
            Frame source = (Frame)e.getSource();
            Point point = new Point(e.getX(),e.getY());
            paints.add(point);
            source.repaint();//刷新重写
        }

 

实现画点功能,

思路,利用集合把坐标存在其中,然后再让画笔去遍历迭代器,然后画出鼠标点击的点

代码:

public class MouseEvent {
    public static void main(String[] args) {
        new myMouseFrame("画点");
    }
}
class myMouseFrame extends Frame{
    ArrayList paints;
    public myMouseFrame(String title) {
        super(title);
        setBounds(500,500,500,400);
        paints=new ArrayList<>();
        setVisible(true);
        addMouseListener(new myMouseListener());
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
    @Override
    public void paint(Graphics g) {
        Iterator iterator = paints.iterator();
        while (iterator.hasNext()){
            Point p = (Point)iterator.next();
            g.setColor(Color.red);
            g.fillOval(p.x,p.y,8,8);
        }
    }
    private  class myMouseListener extends MouseAdapter{
        //鼠标按下事件
        @Override
        public void mousePressed(java.awt.event.MouseEvent e) {
            Frame source = (Frame)e.getSource();
            Point point = new Point(e.getX(),e.getY());
            paints.add(point);
            source.repaint();//刷新重写
        }
    }
}

 三.窗口事件

窗口是基于Frame窗口的事件监听

主要涵盖的事件包括:窗口关闭事件,窗口已经关闭事件,窗口正在关闭事件,窗口激活事件

窗口打开事件监听:

 public void windowOpened(WindowEvent e) {
                System.out.println("窗口打开事件");
            }

 

窗口关闭事件监听:

public void windowClosing(WindowEvent e) {
                System.out.println("窗口关闭事件");
                System.exit(0);
            }

 

窗口已经关闭事件监听:

public void windowClosed(WindowEvent e) {
                System.out.println("窗口已经关闭事件");
            }

 

窗口激活事件监听:

public void windowActivated(WindowEvent e) {
                System.out.println("窗口激活事件");
            }

 

四.键盘监听事件

键盘监听事件也是基于当前的Frame窗口来进行监听的

Java内置了很多标识键盘键位的码,可以通过Ctrl + 右击 KeyEvent来查看各个键位所对应的码

如:键盘上键:0x26,键盘下键:0x28,键盘左键:0x25,键盘右键:0x27

依旧采用适配器模式来创建键盘监听器:

new KeyAdapter() 

或者使用继承的方式:

 class TestKeyListener extends KeyAdapter{
    
 }

 

键盘键位按压事件:

//键盘按压事件
public void keyPressed(KeyEvent e) {

}

 

键盘键位按下并释放事件:

//键盘按下并释放事件,是一整个操作才会触发
 public void keyTyped(KeyEvent e) {

}

 

 

键盘键位释放事件:

//键盘释放事件
public void keyReleased(KeyEvent e) {

}