Java-JUI编程-Lesson2
一.事件监听
一.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) { }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
2022-11-13 SpringBoot - 基础学习 - 什么是SpringBoot