ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java Day12(下)

2020-03-01 18:57:10  阅读:184  来源: 互联网

标签:Java java void class Day12 new TextField public


Java learning_Day12(下)

本人学习视频用的是马士兵的,也在这里献上
<链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA>
提取码:fobs

内容

事件监听

模型:
image.png

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 有如下常用方法:

    image.png

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);
            } 
        });
    }
}

标签:Java,java,void,class,Day12,new,TextField,public
来源: https://www.cnblogs.com/HuoHua2020/p/12391261.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有