JNoteHelper

使用swing构建的java程序, 主要基于miglayout,swingx,flatlatf.

开发得初衷,只是打算作为个人笔记的助手, 因为基于java swing开发, 所以就是java-note-helper得简称.

当你得想法太多时,发现扩展为一个庞大得工具,很累. 比如你想增加更多得功能. 因为你发现之前与你设计得初衷背道而驰时, 你需要重构.

重构不得不说,带给你刺激得时候, 也在考验你得意志力和技术.

或许这只是一个开始, 或许这也是一个结束.

项目基于windows测试及开发 ,所以运行效果图片都基于windows 截图

下载地址: https://download.csdn.net/download/x308561498/87189770?spm=1001.2014.3001.5501

ps: 软件依赖 JDK1.8 +, exe4j打包时为查找windows 注册表jdk 或java_home环境变量

1. 项目地址

可以编辑代码自行修改
JNoteHelper github地址
gitee地址
gitcode地址

2. 模块说明

  • note-swing-core

    封装了一些常用的swing组件, 可以更简单的创建swing组件

  • note-swing-toolkit

    可以用来构建简单的swing小工具 ,里边有部分示例

  • note-swing-editor

    打算专注于写笔记管理的,封装了jnote文件(记录笔记) 和qa文件(记录问题) ,并且集成了jgit
    作为远程同步使用.

  • note-service-toolkit

使用java封装业务逻辑的 java 工具类或工具包, 与swing无关

  • note-swing-framework

整合toolkit 和editor页面构建入口应用, 使用bsaf可以缓存上次打开窗口大小.

3. 系统兼容可能存在的问题

  • SystemFileManager.updateSystemDir2Default() 默认使用了D:/note-helper 作为系统
    应用的主目录 ,可能造成与其他系统不兼容

  • GitRemote 管理,默认使用了注册表存储git信息, 需要修改git保存的相关逻辑

  • 其他应该都是通用的文件存储代码

4. 页面介绍

整体主要受VSCODE 框架影响 ,使用左侧选项卡, 中间目录结构,右侧编辑面板的风格.

4.1 SwingViewApplication 页面总入口

note-swing-framework

cn.note.swing.SwingViewApplication

可以作为整体效果目录, 继承了bsaf 的SingleFrameApplication ,可以记录上次运行后的效果.
当然内嵌 NoteEditorView / QACardView /ToolkitView 也同样可以作为单独应用使用

 ToggleLRCardPanel toggleLRCardPanel = new ToggleLRCardPanel();toggleLRCardPanel.addTab(SvgIconFactory.Note.editor, "笔记管理", new NoteEditorView(true), true);toggleLRCardPanel.addTab(SvgIconFactory.Note.question, "问答管理", new QACardView(true));toggleLRCardPanel.addTab(SvgIconFactory.Note.plugins, "插件管理", new ToolkitView(true));

4.2 NoteEditorView

主要实现了JTree /JTabbedPane 及JTextPane , 实现笔记文件的记录, 主要关心 普通文本,代码块及图片 . 主要实现了查找和全文搜索功能
因为代码属于早期代码, 可能存在很多不合理的设计
主要功能特色:
+ 仿IDE效果, 左侧文件树,右侧选项卡
+ 实现了文本编辑器的按键绑定
+ 扩展了jtextpane的一些特色

主要缺点:
jtextpane 特性了解不够深层, 存在很多bug. 在当作富文本编辑器使用时,存在很多bug. 好多样式效果使用绑定效果, 因为没有时间重构了,所以搁浅了

F1 可以查看主要功能操作

页面查找

全文搜索

4.3 QACardView

初始的设计,是为了记录代码过程中,简短的问题Q和答案A , 左侧实现动态questtion添加, 右侧实现动态answer添加 .

主要功能特色

  • 仿制之前的h5页面效果
  • 实现了动态大小的调整
  • 无弹窗的页内编辑

4.4 ToolkitView

动态扩展工具类视图, 左侧为 工具目录 自定义扩展了(JXTaskPane), 右侧为小工具视图

小工具必须为swing 组件 (必须存在无参构造), 只要你的小工具可以使用main方法运行, 那么在类上使用标记@ItemView注解. 即可自定加入左侧视图控制.

@ItemView(value = "Form示例", order = 101, category = GroupConstants.FORM, description = "Form示例")

主要功能特色

  • 使用@ItemView 注解实现了解耦
  • 使用反射动态扫描

5. note-swing-core 部分功能介绍

5.1 item包

借助MenuItemView ,可以轻松实现 toolkitview 布局, toolkitview的代码也相当简洁


public class ToolkitView extends AbstractMigCard {private MenuItemView menuItemView;public ToolkitView() {}public ToolkitView(boolean card) {super(card);}@Overridepublic LRCard getCardView() {return new LRCard(this.getClass(), menuItemView.getItemSelector().getSelectorComponent(), menuItemView.getItemContainer());}@Overrideprotected void init() {List<ItemNode> menuItems = ItemScanner.scanAllItemView("cn.note.swing.toolkit");menuItemView = new MenuItemView(menuItems);}/*** render视图*/@Overrideprotected void render() {view.add(menuItemView.create(), "grow");menuItemView.setDefaultSelectedItem();}public static void main(String[] args) {ThemeFlatLaf.install();FrameUtil.launchTime(ToolkitView.class);}}

5.2 form包

受react 的rc-form的影响 ,为了在swing 中轻松构建简单的form 元素,快速抒写小工具 . 以下为FormExample的示例, 点击submit, 可以轻松将form 对象值 获取至map对象

@ItemView(value = "Form示例", order = 101, category = GroupConstants.FORM, description = "Form示例")
@Component
public class FormExample extends AbstractMigView {/*** 定义migLayout布局** @return migLayout布局*/@Overrideprotected MigLayout defineMigLayout() {return new MigLayout("wrap 1", "[grow]", "");}@Overrideprotected void render() {// inputInputFormItem username = new InputFormItem("姓名", "请输入姓名");username.setFieldValue("jee");username.useLineStyle(view.getBackground());username.validEmpty().validMaxLength(5);InputFormItem studentId = new InputFormItem("学号", "请输入学号");studentId.validMaxLength(3);InputFormItem idCard = new InputFormItem("身份证号", "请输入身份证号");idCard.validMinLength(3);// group buttonList<String> sexList = CollUtil.newArrayList("男", "女");RadioGroupFormItem sexRadioGroup = new RadioGroupFormItem("性别", sexList);//        List<String> hobbyList = CollUtil.newArrayList("书法", "画画", "运动", "爬山");
//        CheckBoxGroupFormItem hobbyCheckBoxGroup = new CheckBoxGroupFormItem("爱好", hobbyList);// 文件JTextField fileChooser = FileChooserBuilder.inputFileChooser("选择文件");
//        fileChooser.setEnabled(false);InputFormItem addFile = new InputFormItem("文件", fileChooser, "选择文件");// selectSelectedFormItem<SelectedItem> interest = new SelectedFormItem<SelectedItem>("兴趣");interest.useLineStyle(view.getBackground());interest.addSelectItem(new SelectedItem("football", "足球"));interest.addSelectItem(new SelectedItem("basketball", "篮球"));interest.addSelectItem(new SelectedItem("badminton", "羽毛球"));SelectedFormItem<String> code = new SelectedFormItem<String>("代码");code.setSelectItems(CollUtil.newArrayList("java", "html", "css"));// buttonFileChosserButtonFileChooser saveFile = new ButtonFileChooser("保存", file -> {MessageBuilder.ok(this, "保存路径==>" + file);});saveFile.setFileChooserType(FileChooserType.Directory);// checkboxCheckBoxFormItem allowAgree = new CheckBoxFormItem("是否同意");
//        allowAgree.setLeftOffset(50);CheckBoxFormItem allowUse = new CheckBoxFormItem("是否使用代理", true);// formForm form = new Form();form.addTitleSeparator("input");form.addFormItem(username, "username");form.addFormItem(studentId, "studentId");form.addFormItem(idCard, "idCard");form.addFormItem(sexRadioGroup, "sex");
//        form.addFormItem(hobbyCheckBoxGroup, "hobby");form.addTitleSeparator("select");form.addFormItem(interest, "interest");form.addFormItem(code, "code");form.addTitleSeparator("fileChooser");form.addFormItem(addFile, "addFile");form.addTitleSeparator("checkbox");form.addFormItem(allowAgree, "allowAgree");form.addFormItem(allowUse, "allowUse");view.add(form, "center,w 400!");JButton submit = ButtonFactory.primaryButton("submit");view.add(submit, "center");view.add(saveFile, "center");submit.addActionListener((e) -> {boolean validError = form.validFields();if (!validError) {Map<String, Object> values = form.getFormValues();WinUtil.alertMulti(JSONUtil.toJsonPrettyStr(values));}});}
}

5.3 theme包

利用接口, 实现了在swing中构建 统一UI 和组件的思路, 当然可能由于自己知识的浅薄, 可能存在不合理

5.4 其他包

比如弹框, 模态框, 各种loading ,颜色 等等不再一一介绍.

6. 最后

希望该工具对你在构建自己的swing小工具 或java桌面程序有帮助和参考, 因为从零构建一个系统工具 并不是一件轻松的工作.

JNoteHelper 给你的java swing或桌面程序提供一双翅膀相关推荐

  1. java swing开发窗体程序开发(三)事件(Mouse,Foucs,Key,Window)

    接着刚刚的事件讲 补充一点:事件的触发前提,添加了这个监听器的组件必须是处于激活状态的才可行 (一)MouseEvent事件 该事件的触发是由鼠标的动作引起的,引起的情况可以是下面5种,按下鼠标,释放 ...

  2. java swing开发窗体程序开发(四)MVC结构

    MVC是一种设计结构(非设计模式,非设计原则) M:Model 模型层:即用于存储数据的对象 V:View 视图层:即用于为模型提供数据显示的对象 C:Controller 控制器层:即处理用户的业务 ...

  3. java swing开发窗体程序开发(一)GUI编程

    Java SWing就是java提供的一个类库专门用于开发窗体程序的,相对于C#的winform,java swing的开发要比C#更加麻烦,他不像C#拥有可视化的界面编辑工具 而是需要像QT一样纯代 ...

  4. Java Swing实现五子棋程序

    首先感谢08年MLDN出的这个培训视频,我把代码和文档整理了一下,发布出来给需要学习Swing的朋友. 源码地址: https://gitee.com/indexman/gobang 一.知识点准备: ...

  5. 记录java桌面程序swing布局的痛心

    最近需要做一些桌面程序,因为我比较擅长的语言是java,php:只能选择java来做,于是先仿照一些桌面程序来布局练下手,下面就是代码记录了,讲真过程有点痛苦,一度的想换javafx,但是群里朋友说, ...

  6. 使用exe4j打包Java桌面程序为exe

    开发中大家可能也会遇到过将Java(swing)桌面程序打包成exe可执行文件的需求 最近做了两套桌面程序,给需要的小伙伴分享一下步骤吧! 目录 1. 使用Eclipse将项目打成Jar包 2. 使用 ...

  7. Java Swing实用小工具开发

    Java Swing实用桌面小工具开发 ------- 2018.7.11更新 --------- 步骤8中可能出现的问题,可尝试替换jarbundler为最新版本 jarbundler-2.2.0. ...

  8. Java桌面程序开发——如何开发美观漂亮好看的桌面程序

    大家想到使用Java这门编程语言大多是脑海中是浮现的B/S开发,高并发.云计算.大数据等等,今天给大家带来的是Java不一样的使用方式--使用Java做PC桌面程序开发. 不同的是,之前Java是使用 ...

  9. 【转】Java桌面程序开发——如何开发美观漂亮好看的桌面程序

    大家想到使用Java这门编程语言大多是脑海中是浮现的B/S开发,高并发.云计算.大数据等等,今天给大家带来的是Java不一样的使用方式--使用Java做PC桌面程序开发. 不同的是,之前Java是使用 ...

最新文章

  1. Go 语言:The Laws of Reflection 中文版
  2. w3m - 命令行下的浏览器
  3. 初学者python编辑器-分享|Mu 入门:一个面向初学者的 Python 编辑器
  4. java 锁旗标_Java多线程
  5. linux 获取计算机IP地址、MAC、操作系统、时间、DNS
  6. Invitation Cards(建反图 + 跑两遍SPFA)
  7. ubuntu1604安装tensorflow
  8. drupalchina--如何翻译及如何上传翻译的内容?
  9. 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(1)
  10. QQ批量自动登录程序的设计
  11. 2-9 prev + next选择器 “远亲不如近邻” 返回且只返回唯一-个元素。 而通过prev + next选择器就可以查找与“prev”元素紧邻的下一个“next”元素...
  12. 在Windows XP中如何释放并重新获得一个IP地址?
  13. 全球免费开放的电子图书馆
  14. Linux上获取软件程序包
  15. 大牛的十多年技术人生的经验与心得
  16. 人生何尝不是一盘“大富翁”呢
  17. 大数据高级开发工程师——大数据相关工具之一 Sqoop
  18. unimrcpserver的MRCP消息处理
  19. 拒绝服务攻击过程详解
  20. 轻量级单元测试Cmockery源码学习 第一章

热门文章

  1. Vue生命周期钩子的理解
  2. ADS的默认连接分析及编译器产生符号解惑
  3. python如何导入requests模块_浅谈python中requests模块导入的问题
  4. 学习总结——时间戳转日期
  5. 红米k30s至尊纪念版和华为nova7哪个好
  6. 云游戏发展的这三年,阿里元境怎么样了?| 近匠
  7. 音视频之解析flv文件实战
  8. 什么?AI黑白图像能够自动上色?
  9. 【面筋烧烤手册】HTTP数据传输专题
  10. 中国历史时期气候变化影响及其应对的启示