`

利用继承高效率写程序转

    博客分类:
  • Java
阅读更多

软件编程牛人网

2005年2月3日3:41:41

问题:
如果有两个JPopupMenu:a,b
a有个JMenu, b也有,但是b比a要多一个JMenuItem

我们用大写字母代表按钮上的名字
                  

                               __D
按钮a:   A__C__|__E
                              |__F

                           __D
                   C__|__E
                    |      |__F
按钮b    B--|  
                    |--G

         
我最初这样写的:

JPopupMenu a = new JPopupMenu("A");
JPopupMenu b = new JPopupMenu("B");
JMenu c = new JPopupMenu();        //想让a和b公有c     *_*
JMenuItem d = new JMenuItem("D");
JMenuItem e = new JMenuItem("E");
JMenuItem f = new JMenuItem("F");
c.add(d);
c.add(e);
c.add(f);
a.add(c);
现在的实际情况:a按钮是这样的
                __D
A__C__|__E
               |__F
好的,继续。
b.add(c);    //这条语句是后面失败的原因
JMenuItem g = new JMenuItem("G");
b.add(g);
到现在我想象的情况是:
                __D
A__C__|__E
               |__F

              __D
      C__|__E
       |      |__F
 B--|  
      |--G

但是一个组件是不能同时在两个Compoment里面的,所以
在b.add(c);这一句后,本来在a里面的c跑到b上面去了。
所以现在的实际情况是:

-


              __D
      C__|__E
      |      |__F
 B--|  
      |--G
正如我们所见,按钮a什么都没了:(

那么怎么办呢??
在我脑海里首先得到的解决方法是安步就班的一个一个写,
a和b重复的部分就要写两遍。
举个例子,这样写:(当然我没有这样写,为重复的每个按钮变量生成啊,取名啊,设置字体啊,设置颜色啊。。。太累了)

JPopupMenu a = new JPopupMenu("A");
JPopupMenu b = new JPopupMenu("B");
JMenu c = new JPopupMenu();
JMenuItem d = new JMenuItem("D");
JMenuItem e = new JMenuItem("E");
JMenuItem f = new JMenuItem("F");
c.add(d);
c.add(e);
c.add(f);
a.add(c);//a结束
JMenu g = new JPopupMenu();
JMenuItem h = new JMenuItem("D");
JMenuItem i = new JMenuItem("E");
JMenuItem j = new JMenuItem("F");
g.add(h);
g.add(i);
g.add(j);
JMenuItem k = new JMenuItem("G");
b.add(g);
b.add(k);//b结束
好了,现在的实际结果一定是正确的。
看上去假设这么写的好象没多少代码量,但是如前面所说,我们这只是做演示,加上字体、颜色、监听器等等实际上的代码量是非常大的!
其实最大的问题还不是代码量的问题,问题是你的程序的可读性大大降低了!!
要知道swing程序员不仅要构建复杂而且友好的界面,还要对大量的各种事件写监听器,在一大堆难读的代码中寻找按钮还不如要人家去电影院看100遍《2046》:)(2046实在难看,我直说好了)
我们需要让我们的程序可读性高,我不记得是哪位高手说的了:在一份程序的生命周期里,10%的时间用来写它,90%的时间是拿来给人家看的。
诸多原因,我们务必用优雅的方式解决问题:)

我最开始是这样想的:
能否自己写一个MyPopupMenu extends JPopupMenu
如果MyPopupMenu p = new MyPopupMenu();
有一部分MenuItem是已经存在在p里了?

经过实践,实践是真理:)
很快就搞定了。方法是这样的:
制作我们自己的MyJPopupMenu类,它继承自JPopupMenu,把公有的部分全部写进去,这样无论要怎么增加JMenuItem都不会烦了.
MyJPopupButton类如下:
假设在主类ManagerUI.java里面
public class ManagerUI
{
    private ...
    private Font font = new Font(...);
    private Color buttonColor = new Color(...);
    ...
    public ManagerUI()
    {
    ......
    }
    //这里是JPopupMenu的监听器
    private class MyPopupMenuListener implements ActionListener
    {
        ......
    }
    private class MyJPopupMenu extends JPopupMenu
    {
        private JMenuItem d = new JMenuItem("D");
        private JMenuItem e = new JMenuItem("E");
        private JMenuItem f = new JMenuItem("F");
        public MyJPopupMenu()
        {
        }
        public MyJPopupMenu(String name)
        {
            super(name);
        }
        //全部在这个方法里面一次性搞顶了,每个组件等会只需调用一下这个
        //public方法就ok了
        public void addPublicMenuItem()
        {
            //设置字体
            d.setFont(font);
            //设置颜色            
            d.setBackgroundColor(buttonColor); 
            e.setFont(font);
            e.setBackgroundColor(buttonColor);
            f.setFont(font);
            f.setBackgroundColor(buttonColor); 
            MyPopopMenuListener mp = new MyPopopMenuListener();
            d.addActionListener(mp); 
            e.addActionListener(mp);
            f.addActionListener(mp);        
            c.add(d);
            c.add(e);
            c.add(f);
            add(c);     //注意add()方法是继承超类JPopupMenu的
        }
    }
}

在原来需要产生JPopupMenu的地方加上我们的对象,代码是这样的:
public class ManagerUI
{
    private ...
    private Font font = new Font(...);
    private Color buttonColor = new Color(...);
    private JPopupMenu a;//注意这里我们是用公共类,MyJPopupMenu的
    private JPopupMenu b;//父类做的声明,等会需要向下转型
    ...
    public ManagerUI()
    {
        ......
   
        a = new MyJPopupMenu("A");               //非常简洁
        (MyJPopupMenu)a.addPublicMenuItem();     //记得向下转型
        b = new MyJPopupMenu("B");            
        (MyJPopupMenu)b.addPublicMenuItem();  
        JMenuItem c = new JMenuItem("G");      
        b.add(c);  
       
        .....                      
   
    }
    //这里是JPopupMenu的监听器
    private class MyPopupMenuListener implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            String id = ((JMenuItem)event.getSource()).getActionCommand();
            if(id.equals("D"))
            {...}
            else if(id.equals("E"))
            {...}
            else if(id.equals("F"))
            {...}
            else if(id.equals("G"))
            {...}
        }
    }
    private class MyJPopupMenu
    extends JPopupMenu
    implement ActionListener
    {
        private JMenuItem d = new JMenuItem("D");
        private JMenuItem e = new JMenuItem("E");
        private JMenuItem f = new JMenuItem("F");
        public MyJPopupMenu()
        {
        }
        public MyJPopupMenu(String name)
        {
            super(name);
        }
        public void addPublicMenu()
        {
            d.setFont(font);
            d.setBackgroundColor(buttonColor);
            e.setFont(font);
            e.setBackgroundColor(buttonColor);
            f.setFont(font);
            f.setBackgroundColor(buttonColor); 
            MyPopopMenuListener mp = new MyPopopMenuListener();
            d.addActionListener(mp); 
            e.addActionListener(mp);
            f.addActionListener(mp);        
            c.add(d);
            c.add(e);
            c.add(f);
            add(c);
        }
    }
}

最后运行的情况不用我说了,绝对正确无误:)
完了吗?
记得James Cooper说过反正他认为类越多就越难管理,我们可以进一步进行优化,
把JPopupMenu按钮的监听器类删掉吧,为什么不呢?
很简单,只需要用MyJPopupMenu类实现ActionListener接口就可以了
这样完整代码变成这样:

public class ManagerUI
{
    private ...
    private Font font = new Font(...);
    private Color buttonColor = new Color(...);
    private JPopupMenu a;
    private JPopupMenu b;
    ...
    public ManagerUI()
    {
        ......
   
        a = new MyJPopupMenu("A");              
        (MyJPopupMenu)a.addPublicMenuItem();    
        b = new MyJPopupMenu("B");            
        (MyJPopupMenu)b.addPublicMenuItem();  
        JMenuItem c = new JMenuItem("G");      
        b.add(c);  
       
        .....                      
   
    }
    private class MyJPopupMenu
    extends JPopupMenu
    implement ActionListener
    {
        private JMenuItem d = new JMenuItem("D");
        private JMenuItem e = new JMenuItem("E");
        private JMenuItem f = new JMenuItem("F");
        public MyJPopupMenu()
        {
        }
        public MyJPopupMenu(String name)
        {
            super(name);
        }
        public void addPublicMenu()
        {
            d.setFont(font);
            d.setBackgroundColor(buttonColor);
            e.setFont(font);
            e.setBackgroundColor(buttonColor);
            f.setFont(font);
            f.setBackgroundColor(buttonColor); 
            MyPopopMenuListener mp = new MyPopopMenuListener();
            d.addActionListener(this); //注意:记得把这里改成this
            e.addActionListener(this);
            f.addActionListener(this);        
            c.add(d);
            c.add(e);
            c.add(f);
            add(c);
        }
        //把actionPerformed()方法写到这里
        public void actionPerformed(ActionEvent event)
        {
            String id = ((JMenuItem)event.getSource()).getActionCommand();
            if(id.equals("D"))
            {...}
            else if(id.equals("E"))
            {...}
            else if(id.equals("F"))
            {...}
            else if(id.equals("G"))
            {...}
        }
    }
}
终于搞定了,以上代码为了方便阅读用a,b,c...等字母表示的,实际情况当然不是这样:)
小结:
没有什么技术含量...:)
我是菜鸟,平时注意自我总结小经验对自己的Java水平一定有帮助的:)

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/starshus/archive/2005/03/01/306450.aspx

分享到:
评论

相关推荐

    继承与多态程序演示

    在W1_Example1这个文件中,可能会包含具体的代码示例,展示如何定义这些类,以及如何利用继承和多态性来编写程序。可能包括如下内容: 1. `CShape`类的定义,包含虚函数`Draw()`和其他通用属性。 2. `CTriangle`和`...

    c函数大全以及算法效率与程序优化

    程序优化包括了算法优化(如替换低效算法,使用数据结构优化)、代码重构(减少冗余,提高执行效率)、编译器优化(利用编译器提供的选项进行优化)以及硬件层面的优化(比如利用多核并行计算)。优化的目标是在保持...

    高质量+高效率c++

    而高效率则侧重于程序执行时的性能表现,如运行速度和资源占用等。为了实现这两个目标,开发者需要掌握一系列的关键技术和最佳实践。 ### 关键知识点分析 #### 1. **高质量代码的标准** - **可读性**:确保代码...

    高质量C++/C 编程指南,提高编程能力,优化程序效率,编程高手必备

    "高质量C++/C编程指南"是一本旨在帮助程序员提升编程能力和优化程序效率的专业书籍。这本书的标题表明,它不仅关注编程的基本语法,更注重讲解如何编写高效、可维护的代码,这对于任何希望成为编程高手的人来说都是...

    Qt5类继承关系图_qt5类继承关系图_QT5_

    通过这个继承关系图,开发者可以快速定位到特定功能对应的类,了解其在整个框架中的位置,从而更好地利用Qt5的功能来开发高效、可维护的应用程序。 文件名称"Qt5类继承关系图.pdf"暗示了文档的格式,即一个PDF文件...

    高效率编写C/C++

    然而,想要精通C/C++并高效率地编写代码并非易事,幸运的是,我们有如《高效率编写C/C++》这样的书籍,为我们指明了方向。 本书由林锐博士倾力撰写,他在计算机科学领域的深厚造诣,加上其多年来对C/C++编程的深入...

    高质量C++程序设计

    高质量的C++程序设计要求我们充分理解封装、继承和多态这三个基本的OOP概念。封装用于隐藏实现细节,保护数据安全;继承则允许创建新的类,复用已有的代码;多态则提供了接口的一致性,使得不同类型的对象可以被统一...

    利用VBA提高工作效率

    总的来说,VBA是提高工作效率的关键工具,无论是对于普通用户还是专业开发者,都能够通过它实现工作流的自动化,简化日常任务,从而将更多精力集中在创新和更高价值的工作上。学习和掌握VBA,意味着你将拥有强大的...

    C++高级程序设计

    C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言。它的强大之处在于它提供了低级别的内存操作能力,同时保持了高效的运行性能。在C++中,面向对象编程...

    徐传运 JAVA高级程序设计课后习题答案

    在这些章节中,习题可能会涉及到如何创建和管理线程,如何优雅地处理程序运行时的异常,如何利用反射动态操作类和对象,以及如何使用枚举类型增强代码的可读性和安全性。泛型则能提高代码的复用性,减少类型转换的...

    delphi高级程序设计.zip

    6. **程序调试与优化**:书籍也会涉及Delphi的调试工具使用,如调试器的使用技巧,性能分析,以及代码优化策略,帮助开发者找出和修复问题,提高程序运行效率。 7. **Delphi新特性和框架**:随着Delphi版本的更新,...

    自学考试高级语言程序设计习题汇总PPT课件.pptx

    - 并发编程和多线程技术,以利用多核处理器提高程序性能。 7. **程序设计规范和风格**: - 代码格式化和注释的重要性,提高代码可读性和可维护性。 - 遵循一定的命名规则和编程标准,如PEP 8 for Python。 学习...

    高质量java程序设计读书笔记

    然而,合理利用继承可以有效地表达类之间的is-a关系,简化代码结构。 总的来说,高质量的Java程序设计不仅关注代码的功能实现,更注重代码的可读性、可维护性和可扩展性。理解并熟练运用异常处理、继承和组合,是...

    高质量程序设计指南

    《高质量程序设计指南》是一本专注于C++和C语言编程实践的书籍,由林锐和韩永泉两位知名专家合著。这本书旨在帮助程序员提升代码质量和编程...通过深入学习和实践,开发者能够写出更高品质的程序,满足复杂项目的需求。

    《Python编程实战:运用设计模式、冰法和程序库创建高质量程序》迷你书.rar

    书中会深入探讨OOP在Python中的实践,包括如何定义类、创建实例,以及如何利用继承和多态来减少代码重复并提高代码复用性。 总的来说,这本书将帮助读者提升Python编程的专业技能,学习如何利用设计模式优化代码...

    C++编程程序效率简略说明

    然而,值得注意的是,并非所有的C++程序都能自动拥有高效率。C++的一些特殊性质和不当的编程习惯仍然可能导致程序效率降低。此外,许多程序员可能对C++底层实现机制了解不足,这也会影响他们从原理层面上理解如何...

    高级.net程序设计

    首先,面向对象编程(OOP)是.NET程序设计的基础,本书将深入讲解类、接口、继承、多态性等概念,以及如何利用这些概念来设计复杂系统。同时,也会涉及泛型、委托和事件等特性,这些都是.NET中实现高效代码的关键。 ...

    IO标准库继承关系图

    根据提供的文件信息,我们可以深入探讨IO标准库的继承关系及其在计算机...通过理解和利用这些继承关系,开发者可以更高效地完成输入输出相关的任务,提高程序的质量和性能。希望本文对理解IO标准库的继承关系有所帮助。

    C++程序设计 谭浩强

    - **关于类和对象的进一步讨论**:探讨继承、多态等面向对象编程的核心特性,以及如何利用这些特性来设计更为复杂的程序。 - **运算符重载**:学习如何重新定义C++中的内置运算符(如+、-、*等),以适应自定义数据...

Global site tag (gtag.js) - Google Analytics