• 11_1_GUI


    11_1_GUI

    1. AWT

    AWT(Abstract Window Toolkit)包括了很多类和接口,用于Java ApplicationGUI(Graphics User Interface 图形用户界面)编程。

    GUI的各种元素:(如:窗口,按钮,文本框等)Java类来实现。

    使用AWT所涉及的类一般在java.awt包及其子包中。

    ContainerComponentAWT中的两个核心类。

    2. Component&Container

    Java的图形用户界面的最基本组成部分是Component,Component类及其子类的对象用来描述以图形化的方式显示在屏幕上并能与用户进行交互的GUI元素,例如,一个按钮,一个标签等。

    一般的Component对象不能独立地显示出来,必须将“放在”某一的Container对象中才可以显示出来。

    ContainerComponent子类,Container子类对象可以容纳别的Component对象。

    Container对象可使用方法add(..)向其中添加其他Component对象。

    ContainerComponent的子类,因此Container对象也可以当作Component对象添加到其他Container对象中。

    有两种常用的Container

    Window:其对象表示自由停泊的顶级窗口

    Panel:其对象可作为容纳其他Component对象,但不能独立存在,必须被添加到其他Container中(如WindowApplet

    3. Frame

    FrameWindow的子类,由Frame或其子类创建的对象为一个窗体。

    Frame的常用构造方法:

    Frame()

    Frame(String s)创建标题栏为字符串s的窗口。

    setBounds(int x, int y, int width, int height)

    设置窗体位置和大小,x,y是左上角坐标,widthheight是宽度和高度

    setSize(int width, int height)

    设置窗体的大小,widthheight分别是宽度和高度。

    setLocation(int x, int y)

    设置窗体的位置,x,y是左上角坐标

    setBackground(Color c)

    设置背景颜色,参数为Collor对象。

    setVisible(boolean b)

    设置是否可见

    setTitle(String name)

    设置标题

    setResizable(boolean b)

    设置是否可以调整大小

    3.1创建窗口

    TestFrame.java
    
    package Test.GUI;
    
     
    
    import java.awt.Color;
    
    import java.awt.Frame;
    
     
    
    public class TestFrame {
    
     
    
    public static void main(String[] args) {
    
    Frame f = new Frame("我的窗口");
    
    f.setLocation(100, 200);
    
    f.setSize(100, 200);
    
    f.setBackground(Color.blue);
    
    f.setVisible(true);
    
    //不能改变大小
    
    f.setResizable(false);
    
    }
    
    }
    
    TestMultiFrame.java
    
    package Test.GUI;
    
     
    
    import java.awt.Color;
    
    import java.awt.Frame;
    
     
    
    public class TestMultiFrame {
    
     
    
    public static void main(String[] args) {
    
    MyFrame f1 = new MyFrame(100, 100, 200, 200, Color.black);
    
    MyFrame f2 = new MyFrame(300, 100, 200, 200, Color.blue);
    
    MyFrame f3 = new MyFrame(100, 300, 200, 200, Color.red);
    
    MyFrame f4 = new MyFrame(300, 300, 200, 200, Color.CYAN);
    
     
    
    }
    
    }
    
    class MyFrame extends Frame {
    
    static int id = 0;
    
    MyFrame(int x, int y, int w, int h, Color color) {
    
    super("MyFrame" + (++id));
    
    setLayout(null);
    
    setBounds(x, y, w, h);
    
    setBackground(color);
    
    setVisible(true);
    
    }
    
    }
    

    4. Panel

    Panel对象可以看成可以容纳Component的空间

    Panel对象可以拥有自己的布局管理器

    Panel类拥有从其父类继承而来的

    setBounds(int x, int y, int width, int height)

    setSize(int width, int height)

    setLocation(int x, int y)

    setBackground(Color c)

    setLayout(LayoutManager mgr)等方法。

    Panel的构造方法为:

    Panel()使用默认的FlowLayout类布局管理器初始化。

    Panel(LayoutManager layout)使用指定的布局管理器初始化。

    4.1创建panel

    TestPanel.java
    
    package Test.GUI;
    
     
    
    import java.awt.Color;
    
    import java.awt.Frame;
    
    import java.awt.Panel;
    
     
    
    public class TestPanel {
    
     
    
    public static void main(String[] args) {
    
    Frame f = new Frame("Java Frame with Panel");
    
    Panel p = new Panel(null);
    
    f.setLayout(null);
    
    f.setBounds(300, 300, 500, 500);
    
    f.setBackground(new Color(0, 0, 102));
    
    p.setBounds(50, 50, 400, 400);
    
    p.setBackground(new Color(204, 204, 255));
    
    f.add(p);
    
    f.setVisible(true);
    
    }
    
    }
    
    TestMultiPanel.java
    
     
    
    package Test.GUI;
    
     
    
    import java.awt.Color;
    
    import java.awt.Frame;
    
    import java.awt.Panel;
    
     
    
    public class TestMultiPanel {
    
     
    
    public static void main(String[] args) {
    
    new MyFrame2("MyFrame With Panel", 300, 300, 400, 300);
    
    }
    
     
    
    }
    
    class MyFrame2 extends Frame {
    
    private Panel p1, p2, p3, p4;
    
    MyFrame2(String s, int x, int y, int w, int h) {
    
    super(s);
    
    setLayout(null);
    
    p1 = new Panel(null);
    
    p2 = new Panel(null);
    
    p3 = new Panel(null);
    
    p4 = new Panel(null);
    
     
    
    p1.setBounds(0, 0, w/2, h/2);
    
    p2.setBounds(0, h/2, w/2, h/2);
    
    p3.setBounds(w/2, 0, w/2, h/2);
    
    p4.setBounds(w/2, h/2, w/2, h/2);
    
     
    
    p1.setBackground(Color.black);
    
    p2.setBackground(Color.red);
    
    p3.setBackground(Color.gray);
    
    p4.setBackground(Color.blue);
    
     
    
    add(p1);
    
    add(p2);
    
    add(p3);
    
    add(p4);
    
     
    
    setBounds(x, y, w, h);
    
    setVisible(true);
    
    }
    
    }
    
    CenterPanel.java
    
    package Test.GUI;
    
     
    
    import java.awt.Color;
    
    import java.awt.Frame;
    
    import java.awt.Panel;
    
     
    
    public class CenterPanel {
    
     
    
    public static void main(String[] args) {
    
    new MyFrame3("MyFrame3", 300, 300, 400, 400, Color.blue);
    
    }
    
    }
    
     
    
    class MyFrame3 extends Frame {
    
    private Panel p;
    
    MyFrame3(String s, int x, int y, int w, int h, Color color) {
    
    super(s);
    
    setLayout(null);
    
    p = new Panel(null);
    
    p.setBounds(w/4, h/4, w/2, h/2);
    
    p.setBackground(Color.yellow);
    
    add(p);
    
    setBounds(x, y, w, h);
    
    setBackground(color);
    
    setVisible(true);
    
    }
    
    }

    5. 布局管理器

    Java语言中,提供了布局管理器类的对象可以管理

    管理ComponentContainer中的布局,不必直接设置Component位置和大小。

    每个Container都有一个布局管理器对象,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器,调用ContainersetLayout方法改变其布局管理器对象。

    Awt提供了5种布局管理器:

    FlowLayout

    BorderLayout

    GridLayout

    CardLayout

    GridBagLayout

    5.1FloyLayout布局管理器

    FlowLayoutPanel类的默认布局管理器。

    FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行。

    不改变组件的大小,按组件原由尺寸显示组件,可设置不同的组件间距,行距以及对齐方式。

    FlowLayout布局管理器默认的对齐方式是居中。

    5.1.1FlowLayout的构造方法

    new FlowLayout(FlowLayout.RIGHT, 20, 40);

    右对齐,组件之间水平间距20个像素,垂直间距40个像素。

    new FlowLayout(FlowLayout.LEFT);

    左对齐,水平和垂直间距为缺省值(5)

    new FlowLayout();

    使用默认的居中对齐方式,水平和垂直间距为缺省值(5)

    TestFlowLayout.java
    
    package Test.GUI;
    
     
    
    import java.awt.Button;
    
    import java.awt.FlowLayout;
    
    import java.awt.Frame;
    
     
    
    public class TestFlowLayout {
    
     
    
    public static void main(String[] args) {
    
    Frame f = new Frame("FlowLayout");
    
    Button b1 = new Button("ok");
    
    Button b2 = new Button("open");
    
    Button b3 = new Button("close");
    
    f.setLayout(new FlowLayout());
    
    f.add(b1);
    
    f.add(b2);
    
    f.add(b3);
    
    f.setSize(200, 200);
    
    f.setVisible(true);
    
    }
    
    }
    
    TestFlowLayout2.java
    
    package Test.GUI;
    
     
    
    import java.awt.Button;
    
    import java.awt.Color;
    
    import java.awt.FlowLayout;
    
    import java.awt.Frame;
    
     
    
    public class TestFlowLayout2 {
    
     
    
    public static void main(String[] args) {
    
    Frame f = new Frame("FlowLayout");
    
    FlowLayout l = new FlowLayout(FlowLayout.CENTER, 20, 40);
    
    f.setLayout(l);
    
    f.setBackground(Color.blue);
    
    for (int i = 0; i < 5; i++) {
    
    f.add(new Button("BUTTON"));
    
    }
    
    f.setBounds(200, 200, 600, 800);
    
    f.setVisible(true);
    
    }
    
    }

    5.2BorderLayout布局管理器

    BorderLayoutFrame类的默认布局管理器。

    BorderLayout将整个容器的布局划分成

    (EAST)

    西(WEST)

    (SOUTH)

    (NORTH)

    (CENTER)

    五个区域,组件只能被添加到指定的区域。

    如不指定组件的加入部位,则默认加入到CENTER区。

    每个区域只能加入一个组件,如多加人多个,则先前加入的会被覆盖。

    5.2.1BorderLayout型布局容器尺寸缩放原则:

    北、南两个区域在水平方向缩放。

    东、西两个区域在垂直方向缩放。

    中部可在两个方向缩放。

    TestBorderLayout.java
    
    package Test.GUI;
    
     
    
    import java.awt.BorderLayout;
    
    import java.awt.Button;
    
    import java.awt.Frame;
    
     
    
    public class TestBorderLayout {
    
     
    
    public static void main(String[] args) {
    
    Frame f;
    
    f = new Frame("Border Layout");
    
    Button bn = new Button("BN");
    
    Button bs = new Button("BS");
    
    Button bw = new Button("BW");
    
    Button be = new Button("BE");
    
    Button bc = new Button("BC");
    
    f.add(bn, BorderLayout.NORTH);
    
    f.add(bs, BorderLayout.SOUTH);
    
    f.add(bw, BorderLayout.WEST);
    
    f.add(be, BorderLayout.EAST);
    
    f.add(bc, BorderLayout.CENTER);
    
     
    
    f.setSize(200, 200);
    
    f.setVisible(true);
    
    }
    
    }

    5.3GridLayout布局管理器

    GridLayout型布局管理器将空间划分成规则的矩形网络,每个单元格区域大小相等。组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下。

    GridLayout构造方法中指定分隔的行数和列数。

    如:GridLayout(3,4)

    TestGridLayout.java
    
    package Test.GUI;
    
     
    
    import java.awt.Button;
    
    import java.awt.Frame;
    
    import java.awt.GridLayout;
    
     
    
    public class TestGridLayout {
    
     
    
    public static void main(String[] args) {
    
    Frame f = new Frame("GridLayout");
    
    Button b1 = new Button("b1");
    
    Button b2 = new Button("b2");
    
    Button b3 = new Button("b3");
    
    Button b4 = new Button("b4");
    
    Button b5 = new Button("b5");
    
    Button b6 = new Button("b6");
    
    f.setLayout(new GridLayout(3,2));
    
    f.add(b1);
    
    f.add(b2);
    
    f.add(b3);
    
    f.add(b4);
    
    f.add(b5);
    
    f.add(b6);
    
    f.pack();
    
    f.setVisible(true);
    
    }
    
    }
    
    TenButtons.java
    
    package Test.GUI;
    
     
    
    import java.awt.BorderLayout;
    
    import java.awt.Button;
    
    import java.awt.Color;
    
    import java.awt.Frame;
    
    import java.awt.GridLayout;
    
    import java.awt.Panel;
    
     
    
    public class TenButtons {
    
     
    
    public static void main(String[] args) {
    
    Frame f = new Frame("Java Frame");
    
    f.setLayout(new GridLayout(2,1));
    
    f.setBounds(300, 400, 300, 200);
    
    f.setBackground(new Color(204, 204, 255));
    
    Panel p1 = new Panel(new BorderLayout());
    
    Panel p2 = new Panel(new BorderLayout());
    
    Panel p11 = new Panel(new GridLayout(2,1));
    
    Panel p21 = new Panel(new GridLayout(2,2));
    
    p1.add(new Button("BUTTON"), BorderLayout.WEST);
    
    p1.add(new Button("BUTTON"), BorderLayout.EAST);
    
    p11.add(new Button("BUTTON"));
    
    p11.add(new Button("BUTTON"));
    
    p1.add(p11, BorderLayout.CENTER);
    
    p2.add(new Button("BUTTON"), BorderLayout.WEST);
    
    p2.add(new Button("BUTTON"), BorderLayout.EAST);
    
    for (int i = 0; i < 4; i++) {
    
    p21.add(new Button("BUTTON"));
    
    }
    
    p2.add(p21, BorderLayout.CENTER);
    
    f.add(p1);
    
    f.add(p2);
    
    f.setVisible(true);
    
    }
    
    }

     

    6. 布局管理器总结

    Frame是顶级窗口,Frame的缺省布局管理器为BorderLayout

    Panel无法单独显示,必须添加到某个容器中。

    Panel的缺省布局管理器为FlowLayout

    当把Panel作为一个组件添加到某个容器中后,该Panel仍然可以有自己的布局管理器。

    使用布局管理器时,布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件大小和位置属性,如果试图使用Java语言提供的setLocation()setSize(),setBounds等方法,则都会被布局管理器覆盖。

    如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:

    setLayout(null)

    7. 事件监听

             注册

                                                                    接到时间对象后进行某种处理

                            

      

    当某种事件发生                    向监听器传送某种事件对象(封装了某种事件的信息)

    TestActionEvent.java
    
    package Test.GUI;
    
     
    
    import java.awt.BorderLayout;
    
    import java.awt.Button;
    
    import java.awt.Frame;
    
    import java.awt.event.ActionEvent;
    
    import java.awt.event.ActionListener;
    
     
    
    public class TestActionEvent {
    
     
    
    public static void main(String[] args) {
    
    Frame f = new Frame("ActionEvent");
    
    Button b = new Button("Press Me");
    
    Monitor m = new Monitor();
    
    b.addActionListener(m);
    
    f.add(b, BorderLayout.CENTER);
    
    f.pack();
    
    f.setVisible(true);
    
    }
    
    }
    
    class Monitor implements ActionListener {
    
     
    
    @Override
    
    public void actionPerformed(ActionEvent e) {
    
    System.out.println("事件处理");
    
    }
    
     
    
    }
    
    TestActionEvent2.java
    
    package Test.GUI;
    
     
    
    import java.awt.BorderLayout;
    
    import java.awt.Button;
    
    import java.awt.Frame;
    
    import java.awt.event.ActionEvent;
    
    import java.awt.event.ActionListener;
    
     
    
    public class TestActionEvent2 {
    
     
    
    public static void main(String[] args) {
    
    Frame f = new Frame("Test");
    
    Button b1 = new Button("start");
    
    Button b2 = new Button("stop");
    
    Monitor2 m2 = new Monitor2();
    
    b1.addActionListener(m2);
    
    b2.addActionListener(m2);
    
    b2.setActionCommand("Game Over");
    
    f.add(b1, BorderLayout.NORTH);
    
    f.add(b2, BorderLayout.CENTER);
    
    f.pack();
    
    f.setVisible(true);
    
    }
    
    }
    
     
    
    class Monitor2 implements ActionListener {
    
     
    
    @Override
    
    public void actionPerformed(ActionEvent e) {
    
    System.out.println("a button has been pressed," +
    
    "the relative info is:
    " + e.getActionCommand());
    
    }
    
     
    
    }
    
    TFActionEvent.java
    
    package Test.GUI;
    
     
    
    import java.awt.Frame;
    
    import java.awt.TextField;
    
    import java.awt.event.ActionEvent;
    
    import java.awt.event.ActionListener;
    
     
    
    public class TFActionEvent {
    
     
    
    public static void main(String[] args) {
    
    new TFFrame();
    
    }
    
    }
    
    class TFFrame extends Frame {
    
    public TFFrame() {
    
    TextField tf = new TextField();
    
    add(tf);
    
    tf.addActionListener(new TFActionListener());
    
    pack();
    
    setVisible(true);
    
    }
    
    }
    
     
    
    class TFActionListener implements ActionListener {
    
     
    
    @Override
    
    public void actionPerformed(ActionEvent e) {
    
    TextField tf = (TextField)e.getSource();
    
    System.out.println(tf.getText());
    
    tf.setText("");
    
    }
    
     
    
    }
    
    TFPassword.java
    
    package Test.GUI;
    
     
    
    import java.awt.Frame;
    
    import java.awt.TextField;
    
    import java.awt.event.ActionEvent;
    
    import java.awt.event.ActionListener;
    
     
    
    public class TFPassword {
    
     
    
    public static void main(String[] args) {
    
    new TFFrame2();
    
    }
    
    }
    
    class TFFrame2 extends Frame {
    
    public TFFrame2() {
    
    TextField tf = new TextField();
    
    add(tf);
    
    tf.addActionListener(new TFActionListener2());
    
    tf.setEchoChar('*');
    
    pack();
    
    setVisible(true);
    
    }
    
    }
    
     
    
    class TFActionListener2 implements ActionListener {
    
     
    
    @Override
    
    public void actionPerformed(ActionEvent e) {
    
    TextField tf = (TextField)e.getSource();
    
    System.out.println(tf.getText());
    
    tf.setText("");
    
    }
    
     
    
    }
    
    TFMath.java
    
    package Test.GUI;
    
     
    
    import java.awt.Button;
    
    import java.awt.FlowLayout;
    
    import java.awt.Frame;
    
    import java.awt.Label;
    
    import java.awt.TextField;
    
    import java.awt.event.ActionEvent;
    
    import java.awt.event.ActionListener;
    
     
    
    public class TFMath {
    
     
    
    public static void main(String[] args) {
    
    new TFFrame3().launchFrame();
    
    }
    
    }
    
    class TFFrame3 extends Frame {
    
    public void launchFrame() {
    
    TextField num1 = new TextField(10);
    
    TextField num2 = new TextField(10);
    
    TextField num3 = new TextField(15);
    
    Label jb = new Label("+");
    
    Button jd = new Button("=");
    
    setLayout(new FlowLayout());
    
    jd.addActionListener(new MyMonitor(num1, num2, num3));
    
    add(num1);
    
    add(jb);
    
    add(num2);
    
    add(jd);
    
    add(num3);
    
    pack();
    
    setVisible(true);
    
    }
    
    }
    
    class MyMonitor implements ActionListener {
    
     
    
    public MyMonitor(TextField num1, TextField num2, TextField num3) {
    
    super();
    
    this.num1 = num1;
    
    this.num2 = num2;
    
    this.num3 = num3;
    
    }
    
    TextField num1, num2, num3;
    
    public void actionPerformed(ActionEvent e) {
    
    int n1 = Integer.parseInt(num1.getText());
    
    int n2 = Integer.parseInt(num2.getText());
    
    num3.setText("" + (n1 + n2));
    
    }
    
     
    
    }
    
    TFMath.java
    
    package Test.GUI;
    
     
    
    import java.awt.Button;
    
    import java.awt.FlowLayout;
    
    import java.awt.Frame;
    
    import java.awt.Label;
    
    import java.awt.TextField;
    
    import java.awt.event.ActionEvent;
    
    import java.awt.event.ActionListener;
    
     
    
    public class TFMath {
    
     
    
    public static void main(String[] args) {
    
    new TFFrame3().launchFrame();
    
    }
    
    }
    
    class TFFrame3 extends Frame {
    
    TextField num1, num2, num3;
    
    public void launchFrame() {
    
    num1 = new TextField(10);
    
    num2 = new TextField(10);
    
    num3 = new TextField(15);
    
    Label jb = new Label("+");
    
    Button jd = new Button("=");
    
    setLayout(new FlowLayout());
    
    jd.addActionListener(new MyMonitor(this));
    
    add(num1);
    
    add(jb);
    
    add(num2);
    
    add(jd);
    
    add(num3);
    
    pack();
    
    setVisible(true);
    
    }
    
    }
    
    class MyMonitor implements ActionListener {
    
     
    
    /*public MyMonitor(TextField num1, TextField num2, TextField num3) {
    
    super();
    
    this.num1 = num1;
    
    this.num2 = num2;
    
    this.num3 = num3;
    
    }
    
    TextField num1, num2, num3;*/
    
    TFFrame3 tf = null;
    
    public MyMonitor(TFFrame3 tf) {
    
    this.tf = tf;
    
    }
    
    public void actionPerformed(ActionEvent e) {
    
    int n1 = Integer.parseInt(tf.num1.getText());
    
    int n2 = Integer.parseInt(tf.num2.getText());
    
    tf.num3.setText("" + (n1 + n2));
    
    }
    
     
    
    }

    8. 内部类

    好处:

    可以方便的访问包装类的成员

    可以更清楚的组织逻辑,防止不应该被其他类访问的类进行访问。

    何时使用:

    该类不允许或不需要其他类进行访问时。

    TFMath.java
    
    package Test.GUI;
    
     
    
    import java.awt.Button;
    
    import java.awt.FlowLayout;
    
    import java.awt.Frame;
    
    import java.awt.Label;
    
    import java.awt.TextField;
    
    import java.awt.event.ActionEvent;
    
    import java.awt.event.ActionListener;
    
     
    
    public class TFMath {
    
     
    
    public static void main(String[] args) {
    
    new TFFrame3().launchFrame();
    
    }
    
    }
    
    class TFFrame3 extends Frame {
    
    TextField num1, num2, num3;
    
    public void launchFrame() {
    
    num1 = new TextField(10);
    
    num2 = new TextField(10);
    
    num3 = new TextField(15);
    
    Label jb = new Label("+");
    
    Button jd = new Button("=");
    
    setLayout(new FlowLayout());
    
    jd.addActionListener(new MyMonitor());
    
    add(num1);
    
    add(jb);
    
    add(num2);
    
    add(jd);
    
    add(num3);
    
    pack();
    
    setVisible(true);
    
    }
    
    class MyMonitor implements ActionListener {
    
     
    
    public void actionPerformed(ActionEvent e) {
    
    int n1 = Integer.parseInt(num1.getText());
    
    int n2 = Integer.parseInt(num2.getText());
    
    num3.setText("" + (n1 + n2));
    
    }
    
     
    
    }
    
    }
    
    //class MyMonitor implements ActionListener {
    
    //
    
    // /*public MyMonitor(TextField num1, TextField num2, TextField num3) {
    
    // super();
    
    // this.num1 = num1;
    
    // this.num2 = num2;
    
    // this.num3 = num3;
    
    // }
    
    // TextField num1, num2, num3;*/
    
    // TFFrame3 tf = null;
    
    // public MyMonitor(TFFrame3 tf) {
    
    // this.tf = tf;
    
    // }
    
    // public void actionPerformed(ActionEvent e) {
    
    // int n1 = Integer.parseInt(tf.num1.getText());
    
    // int n2 = Integer.parseInt(tf.num2.getText());
    
    // tf.num3.setText("" + (n1 + n2));
    
    // }
    
    //
    
    //}

    9. paint方法

    TestPaint.java
    
    package Test.GUI;
    
     
    
    import java.awt.Color;
    
    import java.awt.Frame;
    
    import java.awt.Graphics;
    
     
    
    public class TestPaint {
    
    public static void main(String[] args) {
    
    new PaintFrame().launchFrame();
    
    }
    
    }
    
    class PaintFrame extends Frame {
    
    public void launchFrame() {
    
    setBounds(200, 200, 640, 480);
    
    setVisible(true);
    
    }
    
    public void paint(Graphics g) {
    
    Color c = g.getColor();
    
    g.setColor(Color.red);
    
    g.fillOval(50, 50, 30, 30);
    
    g.setColor(Color.green);
    
    g.fillRect(80, 80, 40, 40);
    
    g.setColor(c);
    
    }
    
    }

    10.鼠标事件适配器

    抽象类java.awt.event.MouseAdapter实现了MouseListener接口,可以使用其子类作为MouseEvent的监听器,只要重写其相应的方法即可。

    对于其他的监听器,也有对应的适配器。

    使用适配器可以避免监听器类型定义没有必要的空方法。

    MyMouseAdapter.java
    
    package Test.GUI;
    
     
    
    import java.awt.Color;
    
    import java.awt.Frame;
    
    import java.awt.Graphics;
    
    import java.awt.Point;
    
    import java.awt.event.MouseAdapter;
    
    import java.awt.event.MouseEvent;
    
    import java.util.ArrayList;
    
    import java.util.Iterator;
    
     
    
    public class MyMouseAdapter {
    
     
    
    public static void main(String[] args) {
    
    new MyFrame4("drawing");
    
    }
    
    }
    
    class MyFrame4 extends Frame {
    
    ArrayList points = null;
    
    public MyFrame4(String s) {
    
    super(s);
    
    points = new ArrayList();
    
    setLayout(null);
    
    setBounds(300, 300, 400, 400);
    
    setBackground(new Color(204, 204, 255));
    
    setVisible(true);
    
    addMouseListener(new Monitor4());
    
    }
    
     
    
    public void paint(Graphics g){
    
    Iterator i = points.iterator();
    
    while (i.hasNext()) {
    
    Point p = (Point) i.next();
    
    g.setColor(Color.blue);
    
    g.fillOval(p.x, p.y, 10, 10);
    
    }
    
    }
    
    public void addPoint(Point p) {
    
    points.add(p);
    
    }
    
    }
    
    class Monitor4 extends MouseAdapter {
    
     
    
    @Override
    
    public void mousePressed(MouseEvent e) {
    
    MyFrame4 f = (MyFrame4) e.getSource();
    
    f.addPoint(new Point(e.getX(), e.getY()));
    
    f.repaint();
    
    }
    
     
    
    }
    
    package Test.GUI;
    
     
    
    import java.awt.Color;
    
    import java.awt.Frame;
    
    import java.awt.Graphics;
    
    import java.awt.Point;
    
    import java.awt.event.MouseAdapter;
    
    import java.awt.event.MouseEvent;
    
    import java.util.ArrayList;
    
    import java.util.Iterator;
    
     
    
    public class MyMouseAdapter {
    
     
    
    public static void main(String[] args) {
    
    new MyFrame4("drawing");
    
    }
    
    }
    
    class MyFrame4 extends Frame {
    
    ArrayList<Point> points = null;
    
    public MyFrame4(String s) {
    
    super(s);
    
    points = new ArrayList<Point>();
    
    setLayout(null);
    
    setBounds(300, 300, 400, 400);
    
    setBackground(new Color(204, 204, 255));
    
    setVisible(true);
    
    addMouseListener(new Monitor4());
    
    }
    
     
    
    public void paint(Graphics g){
    
    Iterator<Point> i = points.iterator();
    
    while (i.hasNext()) {
    
    Point p = i.next();
    
    g.setColor(Color.blue);
    
    g.fillOval(p.x, p.y, 10, 10);
    
    }
    
    }
    
    public void addPoint(Point p) {
    
    points.add(p);
    
    }
    
    }
    
    class Monitor4 extends MouseAdapter {
    
     
    
    @Override
    
    public void mousePressed(MouseEvent e) {
    
    MyFrame4 f = (MyFrame4) e.getSource();
    
    f.addPoint(new Point(e.getX(), e.getY()));
    
    f.repaint();
    
    }
    
     
    
    }

    11匿名类

    TestWindowClose.java
    
    package Test.GUI;
    
     
    
    import java.awt.Color;
    
    import java.awt.Frame;
    
    import java.awt.event.WindowAdapter;
    
    import java.awt.event.WindowEvent;
    
     
    
    public class TestWindowClose {
    
     
    
    public static void main(String[] args) {
    
    new MyFrame5("drawing");
    
    }
    
    }
    
    class MyFrame5 extends Frame {
    
    public MyFrame5(String s) {
    
    super(s);
    
    setLayout(null);
    
    setBounds(300, 300, 400, 400);
    
    setBackground(new Color(204, 204, 255));
    
    setVisible(true);
    
    this.addWindowListener(new WindowAdapter() {
    
     
    
    @Override
    
    public void windowClosing(WindowEvent e) {
    
    setVisible(false);
    
    System.exit(0);
    
    }
    
    });
    
    }
    
    }
    
    TestAnoymous2.java
    
    package Test.GUI;
    
     
    
    import java.awt.BorderLayout;
    
    import java.awt.Button;
    
    import java.awt.Frame;
    
    import java.awt.TextField;
    
    import java.awt.event.ActionEvent;
    
    import java.awt.event.ActionListener;
    
    import java.awt.event.WindowAdapter;
    
    import java.awt.event.WindowEvent;
    
     
    
    public class TestAnoymous2 {
    
     
    
    public static void main(String[] args) {
    
    new TestAnoymous2();
    
    }
    
     
    
    Frame f = new Frame("TestAnoymous2");
    
    TextField tf = new TextField(10);
    
    Button b = new Button("start");
    
    public TestAnoymous2() {
    
    f.add(b, BorderLayout.NORTH);
    
    f.add(tf, BorderLayout.SOUTH);
    
    b.addActionListener(new ActionListener() {
    
    private int i;
    
    @Override
    
    public void actionPerformed(ActionEvent e) {
    
    tf.setText(e.getActionCommand() + (++i));
    
    }
    
    });
    
    f.addWindowListener(new WindowAdapter() {
    
     
    
    @Override
    
    public void windowClosing(WindowEvent e) {
    
    System.exit(0);
    
    }
    
     
    
    });
    
    f.pack();
    
    f.setVisible(true);
    
     
    
    }
    
    }
    
    TestKey.java
    
    package Test.GUI;
    
     
    
    import java.awt.Frame;
    
    import java.awt.event.KeyAdapter;
    
    import java.awt.event.KeyEvent;
    
     
    
    public class TestKey {
    
     
    
    public static void main(String[] args) {
    
    new KeyFrame();
    
    }
    
    }
    
    class KeyFrame extends Frame {
    
    public KeyFrame() {
    
    setBounds(200, 200, 300, 300);
    
    addKeyListener(new KeyAdapter() {
    
     
    
    @Override
    
    public void keyPressed(KeyEvent e) {
    
    int keyCode = e.getKeyCode();
    
    if(keyCode == KeyEvent.VK_UP) {
    
    System.out.println("UP");
    
    }
    
    }
    
    });
    
    pack();
    
    setVisible(true);
    
    }
    
    }
    
     
  • 相关阅读:
    守护进程-锁-队列(生产者消费者模型)
    正则表达式不包含某个字符串写法
    正则表达式匹配不包含某些字符串的技巧
    08.参数估计_点估计
    07.编程理解中心极限定理
    05.编程理解小数和大数定律
    03.描述性统计代码
    02.描述统计 (descriptive statistics)
    oracle之三手工不完全恢复
    oracle之三手工完全恢复
  • 原文地址:https://www.cnblogs.com/flyback/p/9005366.html
Copyright © 2020-2023  润新知