解析如何开发FineReport的自定义控件

发布时间 - 2026-01-10 21:51:38    点击率:

FineReport作为插件化开发的报表软件,有些特殊需求的功能需要自己开发,开发的插件包帆软官方有提提供,可以去帆软论坛上找,本文将主要介绍如何开发一个自定义控件,这里讲讲方法论。

第一步:实例化一个注册控件的接口

给四个信息 我们的控件类,界面类,图标路径,控件类型名字

package com.hg.free.plugin.customcombo.param;
import com.fr.design.designer.creator.XComboBox;
import com.fr.design.fun.impl.AbstractParameterWidgetOptionProvider;
import com.fr.form.ui.Widget;
public class WidgetRegister extends AbstractParameterWidgetOptionProvider {
  @Override
  public Class<? extends Widget> classForWidget() {
    return CustomComboBox.class;
  }
  @Override
  public Class<?> appearanceForWidget() {
    return XComboBox.class;
  }
  @Override
  public String iconPathForWidget() {
    return "/com/fr/web/images/combobox.png";
  }
  @Override
  public String nameForWidget() {
    return "自定义下拉框";
  }
} 

第二步,重写控件类

package com.hg.free.plugin.customcombo.param;
import com.fr.form.ui.ComboBox;
import com.fr.ui.DataFilter;
public class CustomComboBox extends ComboBox {
  private static final long serialVersionUID = 7169771062153345236L;
  @Override
  public String getXType() {
  return "customcombo";
 }
  @Override
  protected DataFilter createDataFilter() {
  return new CustomComboBoxDataFilter();
 }
}

因为要改变过滤方式,就要重写一个过滤器

package com.hg.free.plugin.customcombo.param;
import com.fr.form.ui.ComboBoxDataFilter;
public class CustomComboBoxDataFilter extends ComboBoxDataFilter {
  @Override
  public boolean isMatch(String txt, String filter) {
    if(null==txt && null!=filter)return false;
    if(null==txt && null==filter)return true;
    return txt.indexOf(filter)!=-1;
  }
} 

第三步,继承前端控件JS

(function($){
  FR.CustomComboBoxEditor = FR.extend(FR.ComboBoxEditor, {
   _init: function () {
   FR.CustomComboBoxEditor.superclass._init.apply(this, arguments);
   }
  });
  $.shortcut("customcombo", FR.CustomComboBoxEditor);
})(jQuery);

好了~以上就是全部的代码开发~然后写个xml用ant打包成插件就可以了。

代码解释:

首先来看这段代码是什么意思呢?

就是我定义了一个控件类型为CustomComboBoxEditor的控件,他继承了ComboBoxEditor的全部方法和属性,并且我把新定义的控件类型的标记声明为customcombo,这个标记有啥用勒,其他用途就不说了,单单说在这里的用途,就是JAVA 本身是不能让前端取生成什么控件的~而是通过告诉前端一个配置,前端的JS引擎(姑且这么称呼他吧)~根据这个配置去执行对应的脚本生成对应的dom样式之类的~shortcut你就这么理解~后台返回一个配置是要生成customcombo这个控件~那么它就像一个map一样找到了对应的键值FR.CustomComboBoxEditor~然后把该控件的配置丢到这个方法里面去执行。就生成我们的控件了。

因为这个例子中并没有对前端有任何修改的要求~所以就没做任何改动~下面看后台。

我们这个例子是要修改模糊匹配的方式。

那么原来控件匹配的机制是怎么搞的,是这样的:假设我是一个老板(妈蛋也只能假设一下了),现在我想了解一份纸质合同的细节,但是公司有一大坨纸质合同我怎么找呢~当然是请个秘书了(|美女|最好),我告诉她我要的合同大概是有些什么信息~然后她去找出来把最后找到的合同给我就可以了。

我们这里控件ComboBox就是老板,ComboBoxDataFilter就是秘书,就是这么个意思,这里每个秘书肯定都有自己找合同的一套方法,以前那个秘书是只要有点相关的就都找出来了,新来的这个秘书是只找老板提示的信息匹配到的合同~查找匹配的方法就是isMatch,这个代码就是这样的,代码的开发其实只要仔细分析就能够映射到现实生活中的很多事务处理上面~因为代码也是人设计的,逻辑总逃脱不了人处理事务的思维。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# FineReport  # 自定义控件  # Java FineReport报表工具导出EXCEL的四种方式  # 数据分析软件之FineReport教程:[5]参数界面JS(全)  # Android自定义控件实现随手指移动的小球  # Android自定义控件仿QQ编辑和选取圆形头像  # Android自定义控件制作显示进度的Button  # Android开发进阶自定义控件之滑动开关实现方法【附demo源码下载】  # Android开发之自定义控件用法详解  # 自定义  # 重写  # 就可以  # 我想  # 我要  # 给我  # 来了  # 在这里  # 好了  # 就像  # 是有  # 你就  # 是这样  # 就不  # 说了  # 下了  # 些什么  # 这段  # 一大  # 能让 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: java ZXing生成二维码及条码实例分享  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  LinuxShell函数封装方法_脚本复用设计思路【教程】  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  用v-html解决Vue.js渲染中html标签不被解析的问题  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何在阿里云ECS服务器部署织梦CMS网站?  IOS倒计时设置UIButton标题title的抖动问题  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  在Oracle关闭情况下如何修改spfile的参数  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel如何使用Gate和Policy进行授权?(权限控制)  lovemo网页版地址 lovemo官网手机登录  制作旅游网站html,怎样注册旅游网站?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  微信小程序 HTTPS报错整理常见问题及解决方案  Laravel怎么在Blade中安全地输出原始HTML内容  如何在IIS服务器上快速部署高效网站?  Laravel怎么在Controller之外的地方验证数据  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  青岛网站建设如何选择本地服务器?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  canvas 画布在主流浏览器中的尺寸限制详细介绍  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  公司门户网站制作流程,华为官网怎么做?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  如何用IIS7快速搭建并优化网站站点?  如何利用DOS批处理实现定时关机操作详解  如何基于云服务器快速搭建网站及云盘系统?  JS中对数组元素进行增删改移的方法总结  如何在阿里云虚拟服务器快速搭建网站?  WEB开发之注册页面验证码倒计时代码的实现  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何实现javascript表单验证_正则表达式有哪些实用技巧  详解jQuery停止动画——stop()方法的使用  如何为不同团队 ID 动态生成多个“认领值班”按钮  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  JavaScript如何实现路由_前端路由原理是什么