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

news2025/1/16 14:58:06

JNoteHelper

使用swing构建的java程序, 主要基于miglayout,swingx,flatlatf, 本来打算作为个人笔记的助手,
但是事与愿违, 发现理想和现实很骨感.

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

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);
    }

    @Override
    public LRCard getCardView() {
        return new LRCard(this.getClass(), menuItemView.getItemSelector().getSelectorComponent(), menuItemView.getItemContainer());
    }

    @Override
    protected void init() {
        List<ItemNode> menuItems = ItemScanner.scanAllItemView("cn.note.swing.toolkit");
        menuItemView = new MenuItemView(menuItems);
    }

    /**
     * render视图
     */
    @Override
    protected 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布局
     */
    @Override
    protected MigLayout defineMigLayout() {
        return new MigLayout("wrap 1", "[grow]", "");
    }


    @Override
    protected void render() {

        // input
        InputFormItem 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 button
        List<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, "选择文件");

        // select
        SelectedFormItem<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"));

        // buttonFileChosser
        ButtonFileChooser saveFile = new ButtonFileChooser("保存", file -> {
            MessageBuilder.ok(this, "保存路径==>" + file);
        });
        saveFile.setFileChooserType(FileChooserType.Directory);

        // checkbox
        CheckBoxFormItem allowAgree = new CheckBoxFormItem("是否同意");
//        allowAgree.setLeftOffset(50);
        CheckBoxFormItem allowUse = new CheckBoxFormItem("是否使用代理", true);
        // form
        Form 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桌面程序有帮助和参考, 因为从零构建一个系统工具 并不是一件轻松的工作.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玩法专利获批,发布4年《Beat Saber》为何持续火爆

从2018年首次上线以来&#xff0c;《Beat Saber》被大家爱了4年多&#xff0c;直到现在热度未减&#xff0c;依然是史上最赚钱的VR游戏之一。该作最开始的概念&#xff0c;就是用红、蓝两色的光剑&#xff0c;根据箭头方向和节奏去切方块&#xff0c;玩法简单爽快&#xff0c;受…

Qt QSS QSlider样式

本文章主要学习QSlider样式 准备下面几张背景图片&#xff1a; 调小图标 、调大图标 ​、QSlider位置图标 ​QSlider划过的背景图标 ​、QSlider未划过的背景图标 ​最终效果图 自己创建一个QSlider工程&#xff0c;此处省略…… CSDN QT大纲&#xff1a;Qt开发必备技术栈学…

[附源码]java毕业设计鞋店销售管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

DM-VERITY流程分析

DM-Verity分析报告 0.问题的表现形式 1.dm-verity的初始化及验证流程 1.1 dm-verity的初始化 初始化dm的log: [ 3.579718] md: Waiting for all devices to be available before autodetect [ 3.586549] md: If you dont use raid, use raidnoautodetect [ 3.594…

Allegro如何录制SCR快捷键操作指导

Allegro如何录制SCR快捷键操作指导 Allegro可以录制SCR快捷键,里面记录了一些操作,类似一个插件,使用的时候可以直接调用,节省时间。下面介绍如何录制 选择file-Script 会出现一个对话框,任意输入一个名字,比如666 然后点击record 比如录制一个打开层面的scr,操作如…

基于matlab的排队系统仿真

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 排队系统是基本的离散事件系统&#xff0c;了解掌握离散事件系统是研究排队系统仿真不可或缺的前提。离散事件系统是指其状态变量只在某些离散时…

SAP-FICO概览培训 的PPT 文档

目录 SAP ERP 系统功能模块概览 财务会计&#xff08;FI&#xff09;、管理会计&#xff08;CO&#xff09; 财务会计&#xff08;FI&#xff09;、管理会计&#xff08;CO&#xff09;需求出发点 FI 与CO灵活性对比 财务会计&#xff08;FI&#xff09; 财务业务一体化平台示…

JSP概述

JSP JSP是Sun为了解决动态生成HTML文档的技术&#xff0c;通过Servlet输出简单html页面信息都非常不方便。如果要输出一个复杂页面的时候&#xff0c;就更加的困难&#xff0c;而且不利于页面的维护和调试。所以sun公司推出一种叫做jsp的动态页面技术来实现对页面的输出繁锁工…

四维轻云地理空间数据协作管理平台的使用流程介绍

倾斜摄影模型和点云数据采集制作完成后&#xff0c;很多行业在进行数据查看管理和共享时具有很大的不便&#xff0c;通常需要依赖专业软件才能在电脑上进行浏览&#xff0c;倘若想将数据分享给他人查看&#xff0c;则需要进行大文件传输以及让对方安装专业软件。现如今&#xf…

年薪百万的程序员,上网都在看什么?

这个问题相信不少人都好奇&#xff0c;我揪出一位年薪百万的程序员老友&#xff0c;翻遍他的收藏夹&#xff0c;总结整理了6个网站&#xff0c;甩出来给大家。 有几个干货网站大家记得当场保存&#xff0c;要不然划过就忘了&#xff01;&#xff01; 国际各行业报告&#xff1…

python 异步线程 实现 异步生产 同步通信

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

傅里叶变换的四种形式

此文转自知乎的jinjin 傅里叶变换的四种形式 - 知乎 傅里叶变换是信号的一种描述方式&#xff0c;通过增加频域的视角&#xff0c;将时域复杂波形表示为简单的频率函数&#xff0c;获得时域不易发现的与信号有关的其他特征。 根据时间域信号x自变量的不同&#xff0c;可以将信号…

sqli-labs/Less-45

这一关有没有报错信息 所以我们不能从报错信息中得知注入类型 我们只能通过登陆成功或者失败去辨别我们判断的注入类型正确与否 然后我们也不懂注入点 所以只能进行尝试了 如果两个参数在SQL语句中都被单引号包裹住 那么假设username为注入点输入如下 username admin# pass…

【强大的数据迁移和恢复解决方案】KernelApps及其产品介绍

KernelApps是 范围广泛的强大的数据迁移和 恢复解决方案 可以根据用户的需求提供多种采购方案 KernelApps提供 交换服务器、Office 365、 电子邮件迁移、Outlook等方面工具 其产品包括数据恢复、文件修复、 数据迁移、电子邮件迁移、 媒体恢复、云备份、云迁移等解决方…

基于32单片机的多功能电子语音时钟

本设计是32单片机的多功能电子语音时钟设计&#xff0c;主要实现以下功能&#xff1a; 1.通过OLED显示时间&#xff0c;日期&#xff0c;温度&#xff0c;湿度等信息 2.到达整点时能够语音播报时间和温湿度 3.可通过按键使语音模块播报时间和温湿度 4.可通过按键调整当前时间&…

Mac M1安装Centos8

M1 芯片 Centos8 百度网盘下载的慢&#xff0c;大家可以直接给我留言&#xff0c;我用奶牛快传分享给大家 链接: https://pan.baidu.com/s/1gT7TnBk5HnT27F82FGht7w?pwd1234 提取码: 1234 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 安装 第一次输入 r 依…

推荐一款高效率前端开发神器,功能太强大了

当前端收到一张设计稿的时候&#xff0c;他们需要考虑非常多的问题。 而第一个摆在面前的问题就是 - 切图。作为连接设计师和前端的重要“纽带”&#xff0c;如果切图不准确&#xff0c;很容易导致最终的产品呈现与设计稿大相径庭。 随之而来的第二个问题就是 - 设计还原。页面…

荧光标记转铁蛋白-(FITC, cy3, cy5, cy7, 香豆素, 罗丹明)

转铁蛋白&#xff08;Tf&#xff09;结合铁是通过与其受体&#xff0c;即Transferrin Receptor 1(TfR1)相互作用而实现的。TfR1 是一种表达于细胞表面的糖蛋白&#xff0c;由两个同源二聚体的亚基通过二硫键连接而成。在细胞表面&#xff0c;Tf与Fe3相互作用形成全铁-Tf&#x…

ESP32 入门笔记07: ESP-NOW (ESP32 for Arduino)

【B站乐鑫】 ESP-NOW 无线通信方案简介 ESP-NOW 是一种快速、无连接的通信技术&#xff0c;具有短数据包传输的特点。 ESP-NOW 是乐鑫开发的一种“协议”&#xff0c;它使多个设备无需使用 Wi-Fi 即可相互通信。该协议类似于低功耗 2.4GHz 无线连接 。在通信之前需要设备之间…

什么是数字孪生?数字孪生技术有没有真正的实用价值?

可以很确定地说&#xff0c;数字孪生技术为我们的生活与工作都提供了巨大的价值。过去几年&#xff0c;在经历了”三起三落”之后&#xff0c;数字孪生再次成为资本和舆论关注的焦点。“数字孪生就像是给你了一个水晶球&#xff0c;能够根据过去和当下发生的事情来预测并模拟未…