一、特殊名词介绍
无
二、背景、场景介绍
该接口支持在设计器cpt&frm参数界面的属性和移动端下添加一个UIExpandablePane(可展开面板)。主要用于对PC端的参数面板的展现配置进行扩展和自定义逻辑。从而解决需要根据配置对参数面板采取不同展现和交互的场景需要。
三、接口介绍
package com.fr.design.fun;
import com.fr.design.designer.properties.PropertyTab;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.stable.fun.mark.Mutable;
/**
* created by hades on 18/10/16
* 该接口支持在设计器cpt&frm参数界面的属性和移动端下添加一个UIExpandablePane(可展开面板)
*/
public interface ParameterExpandablePaneUIProvider extends Mutable {
String XML_TAG = "ParameterExpandablePaneUIProvider";
int CURRENT_LEVEL = 1;
/**
* 创建可展开面板并添加子容器
*
* @return UIExpandablePane
*/
UIExpandablePane createUIExpandablePane();
/**
* 指定添加UIExpandablePane到哪个PropertyTab下,例如属性,移动端
*
* @return PropertyTab
*/
PropertyTab addToWhichPropertyTab();
}
package com.fr.design.foldablepane;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* Created by MoMeak on 2017/7/5.
*/
public class UIExpandablePane extends JPanel {
private static final int LEFT_BORDER = 5;
private static final long serialVersionUID = 1L;
private HeaderPane headerPanel;
private JPanel contentPanel;
private Color color = Color.black;
private String title;
private int headWidth;
private int headHeight;
public JPanel getContentPanel() {
return contentPanel;
}
public UIExpandablePane(String title, int headWidth, int headHeight, JPanel contentPanel) {
super();
this.title = title;
this.headWidth = headWidth;
this.headHeight = headHeight;
this.contentPanel = contentPanel;
initComponents();
}
public UIExpandablePane(String title, int headHeight, JPanel contentPanel) {
super();
this.title = title;
this.headHeight = headHeight;
this.contentPanel = contentPanel;
initComponents();
}
private void initComponents() {
this.setLayout(new BorderLayout());
headerPanel = new HeaderPane(color, title, headHeight);
headerPanel.addMouseListener(new PanelAction());
setcontentPanelontentPanelBorder ();
this.add(headerPanel, BorderLayout.NORTH);
this.add(contentPanel, BorderLayout.CENTER);
setOpaque(false);
}
protected void setcontentPanelontentPanelBorder (){
contentPanel.setBorder(BorderFactory.createEmptyBorder(0 ,LEFT_BORDER, 0, 0));
}
class PanelAction extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
HeaderPane hp = (HeaderPane) e.getSource();
if (contentPanel.isShowing()) {
contentPanel.setVisible(false);
hp.setShow(false);
} else {
contentPanel.setVisible(true);
hp.setShow(true);
}
hp.setPressed(false);
hp.getParent().validate();
hp.getParent().repaint();
}
public void mousePressed(MouseEvent e) {
HeaderPane hp = (HeaderPane) e.getSource();
hp.setPressed(true);
hp.getParent().repaint();
}
@Override
public void mouseExited(MouseEvent e) {
HeaderPane hp = (HeaderPane) e.getSource();
hp.setPressed(false);
hp.getParent().repaint();
}
}
}
package com.fr.design.designer.properties;
public enum PropertyTab {
ATTR, MOBILE
}
四、支持版本
五、插件注册
<extra-designer>
<ParameterExpandablePaneUIProvider class="your class name"/>
</extra-designer>
六、原理说明
在代码中通过 Set<ParameterExpandablePaneUIProvider> pluginCreators = ExtraDesignClassManager.getInstance().getArray(ParameterExpandablePaneUIProvider.XML_TAG); 获取到所有的参数面板的扩展折叠配置面板的接口实例。产品中主要在参数面板初始化时,经由RootDesignDefinePane的addExtraUIExpandablePaneFromPlugin方法读取扩展的面板并初始化到设计器中。
七、特殊限制说明
不论是ParameterExpandablePaneUIProvider接口,还是UIExpandablePane 本身都只提供了配置的UI,但并未提供配置的保存和显示的相关方法。通过该接口是无法直接把配置设置到模板中保存的。
通常需要开发者借助设计器提供的一些常用的API方法来读取到相关的模板和控件,从而实现配置的读写。具体参见设计器常用代码知识
因为参数界面对象本身没有提供可扩展的属性配置,所以如果需要扩展自定义的属性的话,需要配合IOFileAttrMark接口一同使用
八、常用链接
demo地址:demo-parameter-expandable-pane-ui-provider
九、开源案例
免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。
暂无