`
baiguomeng
  • 浏览: 963141 次
文章分类
社区版块
存档分类
最新评论

利用继承高效率写程序

 
阅读更多

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水平一定有帮助的:)

分享到:
评论

相关推荐

    C++程序设计课程讲稿

    ),并利用继承机 制,仅对差异进行程序设计,能提高 程序开发效率(C++\Java)。 C语言 是目前世界上最流行和实用的一种计算机高级程序设计语言。最初的C语言只是为描述和实现 UNIX 操作系统提供一种工作语言而...

    C++程序设计-西工大-1

    其功能强大、面向对象、数据表示丰富、代码运行效率高、可移植性好,适合编写系统软件和各类应用程序。在TIOBE排行榜上,C++语言多年来始终处于前五位。学习程序设计从C++入手,对于培养利用计算机求解现实问题的...

    一次二阶矩法程序设计

    C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。 传统的手工计算方法已不再适应今天高速发展的社会,必须...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    4 最简单的 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数...

    语言程序设计课后习题答案

    因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。C++语言是目前应用最广的面向对象的编程语言。 1-3 什么是结构化程序设计...

    超临界水冷堆物理-热工耦合程序的发展综述

    * 超临界水冷堆具有机组热效率高、系统简单、反应堆厂房和主要设备小型化、技术继承性好、核燃料利用率高等优点。 知识点2:超临界水冷堆物理-热工耦合的必要性 * 超临界水冷堆中冷却剂的轴向密度变化非常剧烈,...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    4 最简单的 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数...

    基于springboot+vue实现校园宿舍管理系统前后端分离源码+数据库文件

    可以进行继承,但是只有final修饰的类不能被继承,通过继承可以使得代码得到重新利用,能够提高软件的开发效率,也是多态的前提。 Java就像C语言、C#语言等,也是一种程序开发语言,而它的特点就是面向对象。作为一...

    基于springboot+vue实现校园宿舍管理系统前后端分离源码+数据库文件分享

    可以进行继承,但是只有final修饰的类不能被继承,通过继承可以使得代码得到重新利用,能够提高软件的开发效率,也是多态的前提。 Java就像C语言、C#语言等,也是一种程序开发语言,而它的特点就是面向对象。作为一...

    电子邮件发送程序的设计与实现.doc

    它的设计目标 就是在继承C/C++强大功能的用时,兼有RAD(快速应用程序开发)语言的高效性。作为 .NET的核心编程语言,c#充分享受了CLR所提供的优势,能够与其他应用程序方便的集成 和交互。下面是对它几个突出特点的...

    PERL语言编程

    听起来挺复杂,不过 Perl 的编译器和解释器干这些活效率相当高,我们的编译-运行-修改的过程几乎都是以秒计。再加上 Perl 的许多其他开发特性,这种快速的角色转换很适合做快速原型设计。然后随着你的程序的成熟,你...

    C#教学PPT,c#从入门到精通第四版

    C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。 [1] C#是面向对象的编程语言。它使得程序员可以快速地...

    c++ primer 第5版(李普曼) part3

     使编写高效率的抽象和库变得更简单  因此,在这个版本的《C++ Primer》中,我们进行了彻底的修改,使用了最新的C++标准,即C++11。为了了解新标准是如何全面影响C++语言的,你可以看一下xxiii页至xxv页的新特性...

    C#微软培训资料

    第十八章 高 级 话 题 .235 18.1 注册表编程 .235 18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 ...

    Java课程设计

    该小程序练习要求学生设计一个学生成绩管理系统,能够输入学生的学号、姓名和成绩等数据,能够按成绩从高到低进行排序,并能够将排序的结果输出。该题目考查学生对Java面向对象编程和数据结构的理解和应用能力。 三...

    基于Java的即时通讯系统设计与实现【文献综述】.doc

    多线程保 证了较高的执行效率。 (4) 分布性 Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL 地址在网络上很方便的访问其他对象。 三、即时通讯系统的环境及研究重点 作为即时通讯的一...

    安川_MP3300系列综合样本.pdf

    控制性能的提高:实现了高速、高精度的运算和应用程序处理,并扩充了程序容量。同时,可与支持开放式运动网络MECHATROLINK-III的伺服、变频器进行高速同步通信,提高了装置的生产效率与性能。 2).操作更方便 (1).自动...

    VisualBasic的概要介绍与分析

    Visual Basic(简称VB)是一种由Microsoft...此外,VB还提供了丰富的组件和库,开发者可以利用这些资源快速建立一个功能完善的应用程序。 对于学习VB的开发者来说,网络上有着丰富的资源可供选择。从入门教程到高级编

Global site tag (gtag.js) - Google Analytics