55 java编程思想 创建窗口和程序片 推荐编码方法

本文探讨了Java中不同事件处理方法的优劣,包括推荐的内部类方法、主类作为监听器的坏主意以及混合使用多种方法。通过对比GoodIdea和BadIdea实例,阐述了最佳实践和代码复用的重要性。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

55.java编程思想——创建窗口和程序片 推荐编码方法

内部类是新的事件模型,并且事实上旧的事件模型连同新库的特征都被它好的支持,依赖老式的编程方法无疑增加了一个新的混乱的因素。现在有更多不同的方法为我们编写讨厌的代码。我们将看到一些关于我们会和不会运行新AWT 的争执,并由向我们展示除了可以原谅的情况,我们可以随时使用接收器类去解决我们的事件处理需要来结束。因为这种方法同样是最简单和最清晰的方法,它将会对我们学习它构成有效的帮助。

在看到任何事以前,我们知道尽管Java 1.1 向后兼容Java 1.0(也就是说,我们可以在1.1 中编译和运行1.0 的程序),但我们并不能在同一个程序里混合事件模型。换言之,当我们试图集成老的代码到一个新的程序中时,我们不能使用老式的action()方法在同一个程序中,因此我们必须决定是否对新程序使用老的,难以维护的方法或者升级老的代码。这不会有太多的竞争因为新的方法对老的方法而言是如此的优秀。

1     准则:运行它的好方法

为了给我们一些事物来进行比较,有一个程序例子演示向我们推荐的方法。到现在它会变得相当的熟悉和舒适。

1.1     代码

import java.awt.*;

import java.awt.event.*;

importjava.util.*;

 

publicclass GoodIdea extends Frame {

    Button b1 =new Button("Button 1"),b2 = new Button("Button 2");

 

    public GoodIdea() {

        setLayout(new FlowLayout());

        b1.addActionListener(new B1L());

        b2.addActionListener(new B2L());

        add(b1);

        add(b2);

    }

 

    publicclassB1L implementsActionListener {

        publicvoid actionPerformed(ActionEvent e) {

            System.out.println("Button 1 pressed");

        }

    }

 

    publicclassB2L implementsActionListener {

        publicvoid actionPerformed(ActionEvent e) {

            System.out.println("Button 2 pressed");

        }

    }

 

    publicstaticvoidmain(String[]args){

        Frame f =new GoodIdea();

        f.addWindowListener(new WindowAdapter() {

            publicvoid windowClosing(WindowEvent e) {

                System.out.println("Window Closing");

                System.exit(0);

            }

        });

        f.setSize(300, 200);

        f.setVisible(true);

    }

} /// :~

这是颇有点微不足道的:每个按钮有它自己的印出一些事物到控制台的接收器。但请注意在整个程序中这不是一个条件语句,或者是一些表示“我想要知道怎样使事件发生”的语句。每块代码都与运行有关,而不是类型检验。也就是说,这是最好的编写我们的代码的方法;不仅仅是它更易使我们理解概念,至少是使我们更易阅读和维护。剪切和粘贴到新的程序是同样如此的容易。

2     将主类作为接收器实现

第一个坏主意是一个通常的和推荐的方法。这使得主类(有代表性的是程序片或帧,但它能变成一些类)执行各种不同的接收器。下面是一个例子:

2.1     代码

import java.awt.*;

import java.awt.event.*;

importjava.util.*;

publicclass BadIdea1 extends Frameimplements ActionListener,WindowListener {

    Button b1 =new Button("Button 1"),b2 = new Button("Button 2");

 

    public BadIdea1() {

        setLayout(new FlowLayout());

        addWindowListener(this);

        b1.addActionListener(this);

        b2.addActionListener(this);

        add(b1);

        add(b2);

    }

 

    publicvoidactionPerformed(ActionEvent e) {

        Object source =e.getSource();

        if (source ==b1)

            System.out.println("Button 1 pressed");

        elseif (source ==b2)

            System.out.println("Button 2 pressed");

        else

            System.out.println("Something else");

    }

 

    publicvoidwindowClosing(WindowEvent e) {

        System.out.println("Window Closing");

        System.exit(0);

    }

 

    publicvoidwindowClosed(WindowEvent e) {

    }

 

    publicvoidwindowDeiconified(WindowEvent e) {

    }

 

    publicvoidwindowIconified(WindowEvent e) {

    }

 

    publicvoidwindowActivated(WindowEvent e) {

    }

 

    publicvoidwindowDeactivated(WindowEvent e) {

    }

 

    publicvoidwindowOpened(WindowEvent e) {

    }

 

    publicstaticvoidmain(String[]args){

        Frame f =new BadIdea1();

        f.setSize(300, 200);

        f.setVisible(true);

    }

} /// :~

这样做的用途显示在下述三行里:

addWindowListener(this);

b1.addActionListener(this);

b2.addActionListener(this);

因为Badidea1 执行动作接收器和窗中接收器,这些程序行当然可以接受,并且如果我们一直坚持设法使少量的类去减少服务器检索期间的程序片载入的作法,它看起来变成一个不错的主意。但是:

(1) Java 1.1 版支持JAR 文件,因此所有我们的文件可以被放置到一个单一的压缩的JAR 文件中,只需要一次服务器检索。我们不再需要为Internet 效率而减少类的数量。

(2) 上面的代码的组件更加的少,因此它难以抓住和粘贴。注意我们必须不仅要执行各种各样的接口为我们的主类,但在actionPerformed()方法中,我们利用一串条件语句测试哪个动作被完成了。不仅仅是这个状态倒退,远离接收器模型,除此之外,我们不能简单地重复使用actionPerformed()方法因为它是指定为这个特殊的应用程序使用的。将这个程序例子与GoodIdea.java 进行比较,我们可以正好捕捉一个接收器类并粘贴它和最小的焦急到任何地方。另外我们可以为一个单独的事件注册多个接收器类,允许甚至更多的模块在每个接收器类在每个接收器中运行。

3     方法的混合

第二个bad idea 混合了两种方法:使用内嵌接收器类,但同样执行一个或更多的接收器接口以作为主类的一部分。这种方法无需在书中和文件中进行解释,而且我可以臆测到Java 开发者认为他们必须为不同的目的而采取不同的方法。但我们却不必——在我们编程时,我们或许可能会倾向于使用内嵌接收器类。

3.1     代码

import java.awt.*;

import java.awt.event.*;

importjava.util.*;

publicclass BadIdea2 extends Frameimplements ActionListener{

    Button b1 =new Button("Button 1"),b2 = new Button("Button 2");

 

    public BadIdea2() {

        setLayout(new FlowLayout());

        addWindowListener(new WL());

        b1.addActionListener(this);

        b2.addActionListener(this);

        add(b1);

        add(b2);

    }

 

    publicvoidactionPerformed(ActionEvent e) {

        Object source =e.getSource();

        if (source ==b1)

            System.out.println("Button 1 pressed");

        elseif (source ==b2)

            System.out.println("Button 2 pressed");

        else

            System.out.println("Something else");

    }

 

    class WLextendsWindowAdapter {

        publicvoid windowClosing(WindowEvent e) {

            System.out.println("Window Closing");

            System.exit(0);

        }

    }

 

    publicstaticvoidmain(String[]args){

        Frame f =new BadIdea2();

        f.setSize(300, 200);

        f.setVisible(true);

    }

} /// :~

因为actionPerformed()动作完成方法同主类紧密地结合,所以难以复用代码。它的代码读起来同样是凌乱和令人厌烦的,远远超过了内部类方法。不合理的是,我们不得不在Java 1.1 版中为事件使用那些老的思路。

4     继承一个组件

创建一个新类型的组件时,在运行事件的老方法中,我们会经常看到不同的地方发生了变化。这里有一个程序例子来演示这种新的工作方法:

4.1     代码

import java.awt.*;

import java.awt.event.*;

class Display {

    publicstaticfinalintEVENT= 0,COMPONENT= 1, MOUSE= 2, MOUSE_MOVE= 3,FOCUS= 4, KEY= 5,ACTION= 6,

            LAST = 7;

    public String[]evnt;

    Display() {

        evnt =new String[LAST];

        for (inti = 0; i < LAST; i++)

            evnt[i] =newString();

    }

    publicvoidshow(Graphics g) {

        for (inti = 0; i < LAST; i++)

            g.drawString(evnt[i], 0, 10 *i+ 10);

    }

}

classEnabledPanel extends Panel {

    Color c;

    intid;

    Display display =new Display();

    public EnabledPanel(inti, Color mc) {

        id = i;

        c = mc;

        setLayout(new BorderLayout());

        add(new MyButton(), BorderLayout.SOUTH);

        addComponentListener(new CL());

        addFocusListener(new FL());

        addKeyListener(new KL());

        addMouseListener(new ML());

        addMouseMotionListener(new MML());

    }

    // Toeliminate flicker:

    publicvoidupdate(Graphics g){

        paint(g);

    }

    publicvoidpaint(Graphics g){

        g.setColor(c);

        Dimension s = getSize();

        g.fillRect(0, 0,s.width, s.height);

        g.setColor(Color.black);

        display.show(g);

    }

    // Don't needto enable anything for this:

    publicvoidprocessEvent(AWTEvent e) {

        display.evnt[Display.EVENT] =e.toString();

        repaint();

        super.processEvent(e);

    }

    class CLimplementsComponentListener {

        publicvoid componentMoved(ComponentEvent e) {

            display.evnt[Display.COMPONENT] ="Component moved";

            repaint();

        }

        publicvoid componentResized(ComponentEvent e) {

            display.evnt[Display.COMPONENT] =

                    "Component resized";

            repaint();

        }

        publicvoid componentHidden(ComponentEvent e) {

            display.evnt[Display.COMPONENT] ="Component hidden";

            repaint();

        }

        publicvoid componentShown(ComponentEvent e) {

            display.evnt[Display.COMPONENT] ="Component shown";

            repaint();

        }

    }

    class FLimplementsFocusListener {

        publicvoid focusGained(FocusEvent e) {

            display.evnt[Display.FOCUS] ="FOCUS gained";

            repaint();

        }

 

        publicvoid focusLost(FocusEvent e) {

            display.evnt[Display.FOCUS] ="FOCUS lost";

            repaint();

        }

    }

 

    class KLimplementsKeyListener {

        publicvoid keyPressed(KeyEvent e) {

            display.evnt[Display.KEY] ="KEY pressed: ";

            showCode(e);

        }

 

        publicvoid keyReleased(KeyEvent e) {

            display.evnt[Display.KEY] ="KEY released: ";

            showCode(e);

        }

 

        publicvoid keyTyped(KeyEvent e) {

            display.evnt[Display.KEY] ="KEY typed: ";

            showCode(e);

        }

 

        void showCode(KeyEvente) {

            intcode = e.getKeyCode();

            display.evnt[Display.KEY] += KeyEvent.getKeyText(code);

            repaint();

        }

    }

 

    class MLimplementsMouseListener {

        publicvoid mouseClicked(MouseEvent e) {

 

            requestFocus(); // Get FOCUS on click

            display.evnt[Display.MOUSE] ="MOUSE clicked";

            showMouse(e);

        }

 

        publicvoid mousePressed(MouseEvent e) {

            display.evnt[Display.MOUSE] ="MOUSE pressed";

            showMouse(e);

        }

 

        publicvoid mouseReleased(MouseEvent e) {

            display.evnt[Display.MOUSE] ="MOUSE released";

            showMouse(e);

        }

 

        publicvoid mouseEntered(MouseEvent e) {

            display.evnt[Display.MOUSE] ="MOUSE entered";

            showMouse(e);

        }

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值