问题背景:
项目中要实现自己的JTable的CellEditor,easy!参考官方例子代码,也就是extends AbstractCellEditor重写里面的getTableCellEditorComponent的方法,可是问题来了,实现了自己的cellEditor,但是其行为为只要点击cell,马上就cell就处于编辑状态,如何实现像默认的情况下,双击启动编辑模式呢?
解决办法:
也许处于惯性思维方式下,想都没有想,便F3到了DefaultCellEditor源码,便开始寻找原始解决方案!
/**
* An integer specifying the number of clicks needed to start editing.
* Even if <code>clickCountToStart</code> is defined as zero, it
* will not initiate until a click occurs.
*/
protected int clickCountToStart = 1;
看到这条语句,心中窃喜,用大腿想都想得到,它就是控制点击次数,从而控制编译器启动的.
public DefaultCellEditor(final JTextField textField) {
editorComponent = textField;
this.clickCountToStart = 2;
delegate = new EditorDelegate() {
public void setValue(Object value) {
textField.setText((value != null) ? value.toString() : "");
}
public Object getCellEditorValue() {
return textField.getText();
}
};
textField.addActionListener(delegate);
}
这个类构造器让我迷惑了好久,原来它里面还有个内部类,这看起来就很复杂了!
习惯了过程化编程思维方式的我,看到这句余音缭绕,弯弯曲曲的语句,会本能的放弃,纵使它实际是很简单,很优雅!
放弃之后我选择了去寻找别的解决方式,google了,在尝试了别的比如有一条无所不能的语句,就可以达到目的的,或者
就万能的语句,最终还是硬着头皮看它是怎么实现的.
这次好像有点感觉了
protected EditorDelegate delegate;
delegate的重复出现,让我好像想到了什么,对了,就是代理,难道这么个短小的几行和一个类,还用了代理模式?
不用怀疑了,它确实用了代理模式!
看了N多设计模式书的我,觉得那就更应该欣赏下这些代码了,而且我的观点一直是:设计模式,不仅让代码质量提高,而且
理解起来更容易的
那它代理了谁呢?这个问题确实让我困惑了很长时间
protected class EditorDelegate implements ActionListener, ItemListener, Serializable {
/** The value of this cell. */
protected Object value;
/**
* Returns the value of this cell.
* @return the value of this cell
*/
public Object getCellEditorValue() {
return value;
}
/**
* Sets the value of this cell.
* @param value the new value of this cell
*/
public void setValue(Object value) {
this.value = value;
}
/**
* Returns true if <code>anEvent</code> is <b>not</b> a
* <code>MouseEvent</code>. Otherwise, it returns true
* if the necessary number of clicks have occurred, and
* returns false otherwise.
*
* @param anEvent the event
* @return true if cell is ready for editing, false otherwise
* @see #setClickCountToStart
* @see #shouldSelectCell
*/
public boolean isCellEditable(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
}
return true;
}
/**
* Returns true to indicate that the editing cell may
* be selected.
*
* @param anEvent the event
* @return true
* @see #isCellEditable
*/
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
/**
* Returns true to indicate that editing has begun.
*
* @param anEvent the event
*/
public boolean startCellEditing(EventObject anEvent) {
return true;
}
/**
* Stops editing and
* returns true to indicate that editing has stopped.
* This method calls <code>fireEditingStopped</code>.
*
* @return true
*/
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
/**
* Cancels editing. This method calls <code>fireEditingCanceled</code>.
*/
public void cancelCellEditing() {
fireEditingCanceled();
}
/**
* When an action is performed, editing is ended.
* @param e the action event
* @see #stopCellEditing
*/
public void actionPerformed(ActionEvent e) {
DefaultCellEditor.this.stopCellEditing();
}
/**
* When an item's state changes, editing is ended.
* @param e the action event
* @see #stopCellEditing
*/
public void itemStateChanged(ItemEvent e) {
DefaultCellEditor.this.stopCellEditing();
}
}
里面实现的接口都是一般的公共的接口,至少不是那种玩具代码一样,一看就看出了代理谁了?
返回前面看,我最初的想法是代理的是JTextField这种可以编辑的组件,这也好像瞒合理的,编辑器嘛,就是那些可以让你可以编辑的组件!
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,
int row, int column) {
delegate.setValue(value);
return editorComponent;
}
观察这个方法,可以很快的否定上面的假设.代理对象在这里并没有真正的去代理可编辑的组件
这个时候让我犯难了,在前后看看AbstractCellEditor,实在想不出端倪!
/**
* The delegate class which handles all methods sent from the
* <code>CellEditor</code>.
*/
突然间看到了这句话,它很快的告诉了delegate的意图,原来代理对象是处理cellEdtor的一些接口!
总结:
没有对象思维方式,去探寻基于像java这种面向对象语言,尤其是其源代码,会让你觉得无路可走!
其实解决这个问题的方式,应该先去弄明白CellEditor这样的接口,看里面封装了些什么行为!
问题的最终解决是,复写一些CellEditor里面的行为,就可以很快的实现了
/**
* Returns true if <code>anEvent</code> is <b>not</b> a
* <code>MouseEvent</code>. Otherwise, it returns true
* if the necessary number of clicks have occurred, and
* returns false otherwise.
*
* @param anEvent the event
* @return true if cell is ready for editing, false otherwise
* @see #setClickCountToStart
* @see #shouldSelectCell
*/
public boolean isCellEditable(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
}
return true;
}
或者直接把上面的代码拷过去,就ok了!
由解决问题方法想到的,自己在面向对象方面,尤其是思维层次上,还是一个弱项!
分享到:
相关推荐
SSCOM源码 DELPHI 源码 绝对源码!欢迎下载
本资源包含2000套微信小程序的源码,对于开发者来说是一份宝贵的参考资料,可以用来学习、研究或者作为开发新项目的起点。 源码下载是开发者获取程序原始代码的方式,对于学习和理解编程逻辑至关重要。这些微信小...
Linux常见驱动源码分析(kernel hacker修炼之道)--李万鹏 李万鹏 IBM Linux Technology Center kernel team 驱动资料清单内容如下: Linux设备模型(中)之上层容器.pdf Linux设备模型(上)之底层模型.pdf Linux...
电商微信小程序源码+后台分享,亲测可用,有需要的朋友拿去!!! 电商微信小程序源码+后台分享,亲测可用,有需要的朋友拿去!!! 电商微信小程序源码+后台分享,亲测可用,有需要的朋友拿去!!! 电商微信小程序...
订餐网,外卖网源码,带积分商城,商家系统,外卖网站建设! 系统特点: 周密策划、项目为先 "项目指导技术,技术服从项目",这是我们一贯秉承的原则,也是我们与其他系统开发商、网站建设公司的本质区别所在!我们...
【借贷公司源码 网贷平台源码 php借贷源码】这个标题揭示了我们要讨论的核心内容,即一套用于建立在线借贷或网贷平台的源代码,该源代码是基于PHP编程语言实现的。PHP是一种广泛使用的开源服务器端脚本语言,尤其在...
易语言源码就是用这种语言编写的程序代码,通过阅读和理解这些源码,开发者可以学习到如何利用易语言来实现特定功能,比如变速齿轮。 在易语言中实现变速齿轮功能,主要涉及到以下几个关键知识点: 1. **系统时间...
ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh...
源码01 销售管理系统 源码02 彩票分析系统 源码03 餐饮管理系统 源码04 C#点名程序 源码05 象棋游戏 源码06 变色球游戏 源码07 多功能计算器 源码08 记事本 源码09 简易画图程序 源码10 成绩管理系统 源码11 BBS论坛...
《cocos creator完整麻将源码解析与开发指南》 cocos Creator是一款强大的2D游戏开发引擎,被广泛应用于游戏开发,尤其是休闲娱乐类游戏,如麻将。本篇将深入探讨"麻将源码"这一主题,结合cocos Creator的特性,为...
移动医疗APP源码是开发医疗健康应用的核心组成部分,它包含了应用程序的所有逻辑和界面设计。在Android平台上,这种源码通常是用Java或Kotlin语言编写的,并使用Android Studio作为集成开发环境(IDE)。在这个案例...
0001-2科技发展有限公司升级版源码 0001科技发展有限公司修正版源码 0002机械配件制造销售公司修正版源码 0003家具地板公司修正版源码 0004-1机械有限公司修正版源码 0004机械有限公司修正版源码 0005机械产品公司...
捕鱼游戏源码是一种基于计算机编程技术,用于开发模拟海洋捕鱼场景的电子游戏的代码集合。这类源码通常包含了游戏逻辑、图形渲染、音频处理、用户交互等多个方面的详细实现,为开发者提供了一个深入理解游戏开发过程...
net-tools arp源码 ifconfig源码 route源码
供应链管理系统源码是一种用于管理企业内部以及与外部合作伙伴之间物流、信息流和资金流的软件解决方案。这个系统的核心目标是优化整个供应链流程,提高效率,降低成本,并确保在正确的时间、正确的地点提供正确的...
《MUD文字游戏源码解析与开发探讨》 MUD,全称为Multi-User Dungeon(多用户地下城),是一种基于文本的在线多人游戏。在视觉化的游戏大行其道的...所以,抓紧时间下载并研究这份源码,开启你的文字游戏探索之旅吧!
Linux系统下的DHCP(Dynamic Host Configuration Protocol)源码解析 DHCP是一种网络协议,用于自动分配IP地址、子网掩码、默认网关等网络配置信息给网络中的设备。在Linux环境中,DHCP服务器通常使用isc-dhcp-...
【标题】:“多功能在线报价系统源码” 在线报价系统是一种基于网络的应用程序,它使得企业或个人能够方便快捷地提供产品或服务的价格信息给潜在客户。这个“多功能在线报价系统源码”是专为此目的设计的,允许用户...
【产品展示网站源码】是一种用于在线展示公司产品的软件代码,它构成了一个网站的基础结构,允许企业以有吸引力的方式向访客展示其商品或服务。此类源码通常包含前端和后端组件,前者负责用户界面的设计和交互,后者...
Bash源码的分析可以帮助我们理解它的内部机制,包括命令解析、变量管理、控制结构、函数定义以及与操作系统内核的交互方式。 源码文件通常包括头文件、主程序代码和辅助函数。在Bash源码中,我们可以看到诸如`...