首页 > 代码库 > GUI

GUI

GUI组件可以分为两类:基本组件和容器。容器是一种特殊的组件。

程序的GUI线程由AWT线程管理,并不是主线程结束窗口就会消失。在多线程中如果有一个前台线程没有结束,改程序就不可能结束。

1. ATW时间处理:

     1.1、 事件处理机制:  事件:用户对组件的一个操作,称之为一个事件。

                                   事件源:发生事件的组件就是事件源。

                                   事件处理器:某个java类中的负责处理事件的成员方法。

 

      一个事件监听器对象负责处理一类事件。 一类事件的每一种发生情况,分别由事件监听器对象中的一个方法来具体处理。  在事件源和事件监听器对象中进行约定的接口类,被称为事件监听器接口。  事件监听器接口类的名称与事件类的名称是对应的,例如:MouseEvent事件类的监听接口名为MouseListener。

     处理发生在某个GUI组件上的XxxEvent事件的某种情况,其事件处理的通用程序编写流程:

      a. 编写一个实现了XxxListener接口的事件监听器类。

      b. XxxListener类中的用于处理该事件情况的方法中,编写处理代码。

      c. 调用组件的addXxxListener方法,将类XxxListener创建的实力对象注册到GUI组件上。

  

class YourWindowListern extends WindowAdapter{    //由于适配器中的方法太简单,不能满足业务的需求所以要对对应的处理方法进行覆盖    @Override    public void windowClosing(WindowEvent e) {         super.windowClosing(e);        e.getWindow().dispose();        System.exit(0);        /*         * 如果一个方法不是自己调用,而是由java内部自己调用,如果出现与结果不一致的情况,要查看此方法是否被调用         * */    }}class MyWindownListern implements WindowListener{    @Override public void windowOpened(WindowEvent e) {}    @Override    public void windowClosing(WindowEvent e) {        e.getWindow().setVisible(false);  //区别两个get方法        ((Window) e.getComponent()).dispose();        //e.get 得到发生事件的事件源        System.exit(0);    }    @Override public void windowClosed(WindowEvent e) {}    @Override public void windowIconified(WindowEvent e) {}    @Override public void windowDeiconified(WindowEvent e) {}    @Override public void windowActivated(WindowEvent e) {}    @Override public void windowDeactivated(WindowEvent e) {}}class ButtonClose implements ActionListener{    private Frame f = null;    public ButtonClose(Frame f) {        this.f = f;    }    @Override    public void actionPerformed(ActionEvent e) {        this.f.dispose();        //System.exit(0);    }    }public class TestFrame {    public static void main(String[] args) {        /*Frame f = new Frame("www.cjt.org");        f.add(new Button("ok"));        f.setSize(300, 300);        f.setVisible(true);    //    f.addWindowListener(new MyWindownListern());  //将事件注册到f对象上        f.addWindowListener(new YourWindowListern());*/        /*    try {            Thread.sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }        f.dispose(); //释放窗口对象*/        //f.setVisible(false);  //设置不可见但f对象仍然在内存对象中                //3. ButtonClose        Frame f = new Frame("www.cjt.org");        f.setSize(300, 200);        Button b = new Button("close");        f.add(b);        f.setVisible(true);        b.addActionListener(new ButtonClose(f));    }}

 

   1.2、事件分类: 按产生事件的物理操作盒GUI组件的表现效果进行分型:  MouseEvent, WindowEvent, ActionEvent ......。

   1.3  事件适配器:  事件适配器类:事件监听器接口的最简单实现类。 用事件适配器来处理事件,可以简化事件监听器的编写。

   1.4 灵活设计事件监听器类: 如果在事件监听器类中要访问非事件源的其他GUI组件,程序该如何编写。(eg:单机button让窗口关闭)

public class TestFrame implements ActionListener{    private Frame f = new Frame("www.cjt.org"+i);    public static int i = 0;    public TestFrame(){        i++;    }    public void init(){        Button b = new Button("close");        f.setSize(300, 200);        f.add(b);        f.setVisible(true);        b.addActionListener(this/*new TestFrame()*/);
}//面向对象编程思想:脑海中是内存中的一个个对象,通过调用方法之后对象状态发生某种变化
public static void main(String[] args) { TestFrame t = new TestFrame(); t.init(); } @Override public void actionPerformed(ActionEvent e) { System.out.println("***"+i); f.dispose(); //System.exit(0); }}

1.4 事件处理的多重运用:

用户的一个操作在触发了低级事件的同时可能也会处罚语义(高级)事件,此时我们就需要合理的选择要处理的事件监听器类型。 eg:用鼠标点击按钮,既触发了鼠标事件也触发了按钮本身所代表的事件,程序应该根据业务的需要选择对事件进行处理,或者两个都进行处理。如果按钮被点击后程序除了要执行按钮所对应功能外,还希望鼠标按下之后按钮的标题改变鼠标释放时候又恢复,这样就需要注册两个事件处理器。一般来说只需要对语义计算进行处理,而不需要对引发该语义事件的低级事件。

  1.5  修改组件的默认事件处理

 

GUI