Java learning_Day12(下)
本人学习视频用的是马士兵的,也在这里献上
<链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA>
提取码:fobs
内容
事件监听
模型:

Button 事件监听
示例
import java.awt.*; import java.awt.event.*; public class TestActionEvent { public static void main(String[] args) { Frame f = new Frame("ActionEvent"); Button b = new Button("Press me!"); MyMonitor m = new MyMonitor(); b.addActionListener(m); f.add(b, BorderLayout.CENTER); f.pack(); f.setVisible(true); } } class MyMonitor implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("A button has been pressed!"); } }
TestField 类
- java.awt.TextField 类用来创建文本框对象、
TextField 有如下常用方法:
TextField 事件监听
- TextField 对象可能发生 Action(光标在文本框内敲回车)时间。与该事件对应的事件类是 java.awt.event.ActionEvent。
- 用来处理 ActionEvent 事件是实现了 java.awt.event.ActionListener 接口的类的对象。ActionListener 接口定义有方法:
- public void actionPerformed(ActionEvent)
- 实现该接口的类要在该方法中添加处理该时间(Action)的语句。
- 使用 addActionListener(ActionListener l) 方法为 TextField 对象注册一个 ActionListener 对象,当 TextField 对象发生 Action 事件时,会生成一个 ActionEvent 对象,该对象作为参数传递给 ActionListener 对象的 actionPerformer 方法在方法中可以获取该对象的信息,并做相应的处理。
示例
import java.awt.*; import java.awt.event.*; public class TFActionEvent { public static void main(String[] args) { new TFFrame(); } } class TFFrame extends Frame { TFFrame() { TextField tf = new TextField(); add(tf); tf.addActionListener(new TFActionListener()); tf.setEchoChar('*'); //设置回显字符 pack(); setVisible(true); } } class TFActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { TextField tf = (TextField)e.getSource(); System.out.println(tf.getText()); tf.setText(""); //输入一次后清空 } }
持有对方引用
拥有 Button 对象后,如何通过监听事件 Button 来获取 TextField 的内容?
以下面程序为例
import java.awt.*; import java.awt.event.*; public class TFMath { public static void main(String[] args) { new TFFrame().launchFrame(); } } class TFFrame extends Frame { TextField num1, num2, num3; public void launchFrame() { num1 = new TextField(10); num2 = new TextField(10); num3 = new TextField(20); Button b = new Button("="); Label l = new Label("+"); b.addActionListener(new TFActionListener(this)); //通过 this 传入整个类对象 setLayout(new FlowLayout()); add(num1); add(l); add(num2); add(b); add(num3); pack(); setVisible(true); } } class TFActionListener implements ActionListener { TFFrame t = null; public TFActionListener(TFFrame t) { this.t = t; } @Override public void actionPerformed(ActionEvent e) { int n1 = Integer.parseInt(t.num1.getText()); int n2 = Integer.parseInt(t.num2.getText()); t.num3.setText("" + (n1 + n2)); } }
上述程序是一个简单的加法计数器,在前两个文本框内输入数字后,点击 “=” 按钮,在第三个文本框内输出和。为了能够获取文本框中的信息,在 ActionListener 中使用了一个传入 Frame 引用的构造函数,借以调用 Frame 中的成员变量。
上述程序也可以使用内部类实现
import java.awt.*; import java.awt.event.*; public class TFMath { public static void main(String[] args) { new TFFrame().launchFrame(); } } class TFFrame extends Frame { TextField num1, num2, num3; public void launchFrame() { num1 = new TextField(10); num2 = new TextField(10); num3 = new TextField(20); Button b = new Button("="); Label l = new Label("+"); b.addActionListener(new TFActionListener()); setLayout(new FlowLayout()); add(num1); add(l); add(num2); add(b); add(num3); pack(); setVisible(true); } private class TFActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { int n1 = Integer.parseInt(num1.getText()); int n2 = Integer.parseInt(num2.getText()); num3.setText("" + (n1 + n2)); } } }
内部类
- 好处:
- 可以方便的访问包装类的成员
- 可以更清除的组织逻辑,防止不应该被其它类访问的类访问。
- 何时使用:
- 该类不允许或不需要其他类进行访问时
Graphics 类
- 每个 Component 都有一个 paint(Graphics g) 用于实现绘图目的,每次重画该 Component 时都自动调用 paint 方法。
- Graphics 类中提供了许多绘图方法,如:
- drawRectangle(int x, int y, int width, int height)
- fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)等
Graphics 类 Paint 方法
- 每个 Component 都有一个 paint(Graphics g)用于实现绘图目的,每次重画该 Component 时都自动调用 paint 方法。
- Graphics 类中提供了许多绘图方法,具体请查询 API 文档。
鼠标事件适配器
- 抽象类 java.awt.event.MouseAdapter 实现了 MouseListener 接口,可以使用其子类作为 MouseEvent 的监听器,只要重写其相应的方法即可。
- 对于其他的监听器,也有对应的适配器。
- 使用适配器可以避免监听器类定义没有必要的孔方法。
- repaint方法的调用顺序:repaint() -> upfate() -> paint()
示例
import java.awt.*; import java.awt.event.*; import java.util.*; public class MyMouseAdapter { public static void main(String[] args) { new MyFrame("Drawing"); } } class MyFrame extends Frame { ArrayList<Point> points = null; MyFrame(String s) { super(s); points = new ArrayList<Point>(); setLayout(null); setBounds(300, 300, 300, 300); setBackground(new Color(100, 180,240)); setVisible(true); addMouseListener(new MyMonitor()); } public void addPoint(Point p) { points.add(p); } @Override public void paint(Graphics g) { Iterator<Point> i = points.iterator(); while (i.hasNext()) { Point p = (Point)i.next(); g.setColor(Color.BLUE); g.fillOval(p.x, p.y, 5, 5); } } } class MyMonitor extends MouseAdapter { public void mousePressed(MouseEvent e) { MyFrame f = (MyFrame)e.getSource(); f.addPoint(new Point(e.getX(), e.getY())); f.repaint(); //使得添加的点可以立即显示 } }
以上程序新建了一个MyFrame类,通过监听鼠标的点击事件,在 MyFrame 对象中根据鼠标触点位置添加点对象。根据 repaint() 方法的调用顺序,在 MyFrame 类的 paint 方法中添加或者说重画点。
Window 事件
- Window 事件所对应的事件类为 WindowEvent,所对应的的事件监听接口为 WindowListener。
- WindowListener 定义的方法有:
public void windowOpened(WindowEvent e) public void windowClosing(WindowEvent e) public void windowClosed(WindowEvent e) public void windowIconified(WindowEvent e) public void windowDeiconified(WindowEvent e) public void windowActivated(WindowEvent e) public void windowDeactivated(WindowEvent e)
- 与 WindowListener 对应的适配器为 WindowAdapter。
以 WindowListener 中的 windowClosing 方法为例
import java.awt.*; import java.awt.event.*; public class TestWindowClose { public static void main(String[] args) { new MyFrame("Window closing"); } } class MyFrame extends Frame { MyFrame(String s) { super(s); setLayout(null); setBounds(300, 300, 300, 300); setVisible(true); setBackground(new Color(100, 180,240)); addWindowListener(new MyWindowMonitor()); } class MyWindowMonitor extends WindowAdapter { @Override public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } } }
上述是一个简单的通过内部类来实现的关闭窗口程序。
上述程序也可以用匿名类来实现
import java.awt.*; import java.awt.event.*; public class TestWindowClose { public static void main(String[] args) { new MyFrame("Window closing"); } } class MyFrame extends Frame { MyFrame(String s) { super(s); setLayout(null); setBounds(300, 300, 300, 300); setVisible(true); setBackground(new Color(100, 180,240)); MyWindowMonitor()); addWindowListener( //匿名内部类 new WindowAdapter() { public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } }); } }
来源:https://www.cnblogs.com/HuoHua2020/p/12391261.html