JDialog对话框继承结构小议

1.背景:在Swing的应用程序中,许多地方都需要用到对话框,对话框的作用各式各样,但是有许多对话框的结构其实有共同之处,现在介绍一个对话框的继承体系,只拿最底层的具体类是增加,修改,删除的对话框做详细讲解

 

2.继承体系 IModelDlg<--SimpleInputDlg<--SimpleModelInputDlg<--UserInputDlg

 

3.IModelDlg接口

 

/**
 * 系统中有着大量的对话框,这个接口提供了一个统一的界面
 *
 * 对话框使用了MVC模式
 */
public interface IModelDlg {

 

 /**
  * 显示对话框,对话框使用了MVC模式
  *
  * @param model,对话框的MODEL,也就是要显示的数据,可以是NULL
  */
 public void showModelInputDlg(Object model);

 

 /**
  * 对话框的使用者可以通过这个函数来传递参数
  *
  * @param props
  */
 public void setPropertyMap(Map props);

 

 /**
  * 返回对话框输入的结果
  *
  * @return
  */
 public Object getInputResult();

 

 /**
  * 返回输入是否完成,如果完成,则用户可以用getInputResult()来得到结果。
  *
  * 如果用户中途按‘取消’,退出输入则输入没有完成,如果按‘确定’则表示输入完成
  *
  * @return 输入是否完成
  */
 public boolean isInputFinished();


}

 

仔细分析:为何此接口只定义以上四个方法

对于一个对话框使用MVC模式,当然需要传输Model,显示对话框就可以啦。

然后对于对话框可能需要Model以外的其他信息,比如配置,大小等等

所有需要一个设置值的方法,然后对话框内部的处理,我们就没有必要去管,那是对话框的事,我们只需要给他信息,然后取得结果就可以啦。为什么还需要一个判断是否用户完成,当对话框没有处理完成时,你当然不能去获取值,比如在多线程中!

 

所以IModelDlg接口设置以上方法,是比较恰当。你给IModelDlg信息,然后取得信息即可,其他的问题。是对话的负责的,是对话框的行为,和我们没有关系。我们只坐享其成就可以啦!

 


 4.抽象类:SimpleInputDlg

<1>SimpleInputDlg类是代表以下行为和责任的对话框

/**
 * 输入框GUI包括了三个部分,上面的信息PANEL,中间的主PANEL和下面的BUTTON PANEL
 *
 * CLASS没有提供界面具体的建造,提供了一些工具函数,定义了建造的过程
 *
 * 还提供了反射调用功能ButtonListenerForSimpleInputDlg和MyControlListener
 */

 

<2>我们看看几个主要方法

 

public SimpleInputDlg(IResourceLoader loader) {
  super(MainFrame.getMainFrame());
  m_resourceLoader = loader;
  setModal(true);
  setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

 }

 

/**

*此方法构建上,中,下对话框的结构,具体实现,留给子类

*

*/

public void showModelInputDlg(Object model) {
  setDlgTitle();
  // 根据dialog状态初始化界面UI的基本框架
  layoutGUI();
  initializeForControls();
  // prepare data before
  fillDataIntoControls();
  if (shouldBeSeen()) {
   setInputDlgSize();
   addWindowListener(new MyWindowAdaptor());
   ResourceUtil.moveWindowToCenter(this);
   setVisible(true);
  }
 }

 

 public void setPropertyMap(Map propertyMap) {
  this.m_propertyMap = propertyMap;
 }

 

 public Object getInputResult() {
  throw new RuntimeException("not implemented");
 }

 

 public boolean isInputFinished() {
  throw new RuntimeException("not implemented");
 }

 

  //子类必须实现的方法

 abstract protected String getDefaultInfo();

 abstract protected JComponent createMainInfoPanel();

 abstract protected JPanel createButtonPanel();

 

 //另外此类还提供了其他的工具方法,比如事件监听

 protected IControlListener getControlListener() {
  return new MyControlListener();
 }

 

<3>另外在SimpleModelDlg中,对于对话框中的控件的处理,都是交给

protected Map m_actionHandlers = new HashMap();

m_actionHandlers中存放的是IActionHandler(后续章节做介绍),此处只需知道对于对话框控件,比如输入控件,当输入名字或者选择什么之类的事件都交给IActionHandler处理,这样就达到界面中的业务逻辑和界面的分离,对于以后的扩张和修改,都是很好的

 

5.抽象类:SimpleModelInputDlg

此类得行为是:在插件面板中,增加或者修改时,弹出对话框(此对话框具有增加,修改,浏览的功能),模型就是插件面板表格中的数据,当对对话框的模型进行增加或者修改后,要反映到插件面板中

<1>上面介绍的实现是通过:

 public SimpleModelInputDlg(ISimpleInputDlgHandler handler,
   IPluginResourceLoader loader, int status) {
  super(loader);
  m_handler = handler;
  m_status = status;
 }

ISimpleInputDlgHandler接口,插件面板实现此接口,当对话框完成操作后,就调用ISimpleInputDlgHandler接口方法,反映到插件面板

 

public interface ISimpleInputDlgHandler {

 

 public IDynamicPanelBeanFactory getBeanFactory();
 
 public void refreshTable(Object model);
 
 public String insertModelIntoTable(Object model);

 



}

 对于抽象类其他的方法,就不做具体介绍,重要是理解接口中的方法,然后SimpleInputDlg采用模板模式,布局对话框格式,对于对话框中控件的控制,交个IActionHandler处理,在比较典型的增加,修改,浏览对话框中,就是用于插件面板增加,修改,浏览的对话框,数据反映到插件面板时通过,ISimpleInputDlgHandler

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tof21

支持原创

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值