- 浏览: 137956 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
Ken艹小哲:
太赞了 哥们 加扣
猜数字问题的最少步数算法. -
chenyuan122912:
...
解决AS3 Socket编程中最令人头疼的问题 -
hyx0914:
有源代码打包下载的吗?
Flex地图分块加载的实现 -
tianhai110:
非常有价值的 测试总结
时间效率,Timer和EnterFrame在FP 10.1之后测试和建议 -
763675117:
你好,fengxiangpiao,看了你的文档,我的需求和你差 ...
解决MovieClip打印问题 转
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
发表评论
-
在Eclipse中用JDBC连接Sql Server 2005总结
2010-12-13 11:01 782* 最近因为开发活动需要,用上了Eclipse,并要求使用精简 ... -
Java文件操作详解
2010-12-11 15:10 640输入输出流 在Java中, ... -
如何衔接不同文件中的swing组件转
2010-11-11 21:47 789软件编程牛人网 2005年2月2日3:43:23 问题是: ... -
一个简单的IP地址管理系统源代码
2010-11-11 21:46 753软件编程牛人网 import java.io.Buffere ... -
Java游戏学习转
2010-11-11 21:44 707软件编程牛人网 这几 ... -
FTP 协议(rfc939) 简单的实验(in Java)
2010-11-11 21:41 681Java代码:FTPClient.javapackage or ... -
70个JAVA问答
2010-11-09 15:20 922软件编程牛人网 1. ... -
提升JSP应用程序的七大绝招转
2010-11-09 15:17 633软件编程牛人网 你时常被客户抱怨JSP页面响应 ... -
java读取操作系统环境变量
2010-11-04 16:06 687在家上网赚钱更容易 /** 文件名:SysP ... -
JAVA中浅复制与深复制
2010-11-04 15:52 579在家上网赚钱更容易 1.浅复制与深复制概念⑴浅复制(浅克 ... -
Java网络编程从入门到精通(29):服务端Socket的选项
2010-11-03 12:11 673在家上网赚钱更容易 ServerSocket类有以下三个选项 ... -
Java网络编程从入门到精通(30):定制accept方法
2010-11-03 12:10 641在家上网赚钱更容易 ... -
Java网络编程从入门到精通(31):非阻塞I/O简介
2010-11-03 12:08 714在家上网赚钱更容易 在网络应用中,一般可以采用同步I ... -
Java网络编程从入门到精通(32):一个非阻塞I/O的例子
2010-11-03 12:07 705在家上网赚钱更容易 为了使读者更好地理解非阻塞I/O ... -
Java网络编程从入门到精通(33):非阻塞I/O的缓冲区(Buffer)
2010-11-03 12:05 577在家上网赚钱更容易 如果将同步I/O方式下的数据传输 ... -
Java网络编程从入门到精通(34):读写缓冲区中的数据---使用get和put方法按顺序读写单个数据
2010-11-03 12:03 600在家上网赚钱更容易 ... -
jsp 图形验证码 IllegalStateException 异常
2010-11-02 18:27 676在家上网赚钱更容易 最近用了jsp做了一个简单的图形验证码, ...
相关推荐
在W1_Example1这个文件中,可能会包含具体的代码示例,展示如何定义这些类,以及如何利用继承和多态性来编写程序。可能包括如下内容: 1. `CShape`类的定义,包含虚函数`Draw()`和其他通用属性。 2. `CTriangle`和`...
程序优化包括了算法优化(如替换低效算法,使用数据结构优化)、代码重构(减少冗余,提高执行效率)、编译器优化(利用编译器提供的选项进行优化)以及硬件层面的优化(比如利用多核并行计算)。优化的目标是在保持...
而高效率则侧重于程序执行时的性能表现,如运行速度和资源占用等。为了实现这两个目标,开发者需要掌握一系列的关键技术和最佳实践。 ### 关键知识点分析 #### 1. **高质量代码的标准** - **可读性**:确保代码...
"高质量C++/C编程指南"是一本旨在帮助程序员提升编程能力和优化程序效率的专业书籍。这本书的标题表明,它不仅关注编程的基本语法,更注重讲解如何编写高效、可维护的代码,这对于任何希望成为编程高手的人来说都是...
通过这个继承关系图,开发者可以快速定位到特定功能对应的类,了解其在整个框架中的位置,从而更好地利用Qt5的功能来开发高效、可维护的应用程序。 文件名称"Qt5类继承关系图.pdf"暗示了文档的格式,即一个PDF文件...
然而,想要精通C/C++并高效率地编写代码并非易事,幸运的是,我们有如《高效率编写C/C++》这样的书籍,为我们指明了方向。 本书由林锐博士倾力撰写,他在计算机科学领域的深厚造诣,加上其多年来对C/C++编程的深入...
高质量的C++程序设计要求我们充分理解封装、继承和多态这三个基本的OOP概念。封装用于隐藏实现细节,保护数据安全;继承则允许创建新的类,复用已有的代码;多态则提供了接口的一致性,使得不同类型的对象可以被统一...
总的来说,VBA是提高工作效率的关键工具,无论是对于普通用户还是专业开发者,都能够通过它实现工作流的自动化,简化日常任务,从而将更多精力集中在创新和更高价值的工作上。学习和掌握VBA,意味着你将拥有强大的...
C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言。它的强大之处在于它提供了低级别的内存操作能力,同时保持了高效的运行性能。在C++中,面向对象编程...
在这些章节中,习题可能会涉及到如何创建和管理线程,如何优雅地处理程序运行时的异常,如何利用反射动态操作类和对象,以及如何使用枚举类型增强代码的可读性和安全性。泛型则能提高代码的复用性,减少类型转换的...
6. **程序调试与优化**:书籍也会涉及Delphi的调试工具使用,如调试器的使用技巧,性能分析,以及代码优化策略,帮助开发者找出和修复问题,提高程序运行效率。 7. **Delphi新特性和框架**:随着Delphi版本的更新,...
- 并发编程和多线程技术,以利用多核处理器提高程序性能。 7. **程序设计规范和风格**: - 代码格式化和注释的重要性,提高代码可读性和可维护性。 - 遵循一定的命名规则和编程标准,如PEP 8 for Python。 学习...
然而,合理利用继承可以有效地表达类之间的is-a关系,简化代码结构。 总的来说,高质量的Java程序设计不仅关注代码的功能实现,更注重代码的可读性、可维护性和可扩展性。理解并熟练运用异常处理、继承和组合,是...
《高质量程序设计指南》是一本专注于C++和C语言编程实践的书籍,由林锐和韩永泉两位知名专家合著。这本书旨在帮助程序员提升代码质量和编程...通过深入学习和实践,开发者能够写出更高品质的程序,满足复杂项目的需求。
书中会深入探讨OOP在Python中的实践,包括如何定义类、创建实例,以及如何利用继承和多态来减少代码重复并提高代码复用性。 总的来说,这本书将帮助读者提升Python编程的专业技能,学习如何利用设计模式优化代码...
然而,值得注意的是,并非所有的C++程序都能自动拥有高效率。C++的一些特殊性质和不当的编程习惯仍然可能导致程序效率降低。此外,许多程序员可能对C++底层实现机制了解不足,这也会影响他们从原理层面上理解如何...
首先,面向对象编程(OOP)是.NET程序设计的基础,本书将深入讲解类、接口、继承、多态性等概念,以及如何利用这些概念来设计复杂系统。同时,也会涉及泛型、委托和事件等特性,这些都是.NET中实现高效代码的关键。 ...
根据提供的文件信息,我们可以深入探讨IO标准库的继承关系及其在计算机...通过理解和利用这些继承关系,开发者可以更高效地完成输入输出相关的任务,提高程序的质量和性能。希望本文对理解IO标准库的继承关系有所帮助。
- **关于类和对象的进一步讨论**:探讨继承、多态等面向对象编程的核心特性,以及如何利用这些特性来设计更为复杂的程序。 - **运算符重载**:学习如何重新定义C++中的内置运算符(如+、-、*等),以适应自定义数据...