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