likes
comments
collection
share

使用JavaFx开发一些常用的小工具

作者站长头像
站长
· 阅读数 54

作为一个Java开发工程师,一直有一个想用java写桌面端程序的想法。最近想把一些常用的工具都使用javafx封装起来。这样每次都不用去网络上找,直接打开自己写的小工具就可以了。

idea创建

使用JavaFx开发一些常用的小工具

建议使用gradle来进行构建,这样打包时可以直接使用jlink或者jpackage来进行打包。

按照步骤,选择我们常用的组件即可。自动生成的项目是带module-info.java文件的,模块化便于后续打包时包体更小。

编写JavaFx代码

SHA算法

JavaFx是xml和controller分离的结构。我们需要通过SceneBuilder工具来编写我们xml工具,直接拖动即可。idea其实也提供了打开fxml文件的途径。

使用JavaFx开发一些常用的小工具

使用JavaFx开发一些常用的小工具

具体SceneBuilder的使用可以自行摸索一下,还是非常简单的。剩下的就是处理我们的逻辑了。涉及到一个输入文本,两个输出文本,一个选择框(切换算法),三个事件。

package cn.db.tools.dbtools.controller;

import cn.db.tools.dbtools.message.ToastMessage;
import com.google.common.hash.HashCode;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import com.google.common.io.BaseEncoding;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DataFormat;
import org.pomo.toasterfx.model.impl.ToastTypes;

import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * @author:zooooooooy
 * @date: 2023/8/9 - 18:10
 */
public class Sha1Controller implements Initializable {

    @FXML
    private TextArea originalTextArea;

    @FXML
    TextField textFieldHex;

    @FXML
    TextField textFieldBase64;

    @FXML
    ChoiceBox choiceBox;

    BaseEncoding baseEncoding = BaseEncoding.base64();

    @FXML
    protected void originTextChanged() {

        originTextChanged(choiceBox.getSelectionModel().selectedIndexProperty().get());
    }

    private void originTextChanged(int type) {

        HashFunction hashFunction = null;
        switch (type) {
            case 0:
                hashFunction = Hashing.sha1();
                break;
            case 1:
                hashFunction = Hashing.sha256();
                break;
            case 2:
                hashFunction = Hashing.sha512();
                break;
        }

        HashCode hashCode = hashFunction.hashBytes(originalTextArea.getText().getBytes(StandardCharsets.UTF_8));
        textFieldHex.setText(hashCode.toString());
        textFieldBase64.setText(baseEncoding.encode(hashCode.asBytes()));
    }



    @FXML
    protected void copyTextFieldHex() {
        Clipboard sc = Clipboard.getSystemClipboard();
        ClipboardContent clipboardContent = new ClipboardContent();
        clipboardContent.put(DataFormat.PLAIN_TEXT, textFieldHex.getText());

        sc.setContent(clipboardContent);

        // 弹出toast消息
        ToastMessage.getInstance().popMessage("复制成功", ToastTypes.SUCCESS);
    }

    @FXML
    protected void copyTextFieldBase64() {
        Clipboard sc = Clipboard.getSystemClipboard();
        ClipboardContent clipboardContent = new ClipboardContent();
        clipboardContent.put(DataFormat.PLAIN_TEXT, textFieldBase64.getText());

        sc.setContent(clipboardContent);

        // 弹出toast消息
        ToastMessage.getInstance().popMessage("复制成功", ToastTypes.SUCCESS);
    }


    @Override
    public void initialize(URL location, ResourceBundle resources) {
        choiceBox.setItems(FXCollections.observableArrayList("SHA1", "SHA256", "SHA512"));
        choiceBox.getSelectionModel().select(0);

        choiceBox.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                // 触发改变
                originTextChanged((int) newValue);
            }
        });
    }
}

根据我们选择的算法不同,自动输出对应的加密后的数据。对接Toast弹窗工具,复制时进行右下角提示。

使用JavaFx开发一些常用的小工具

菜单栏

直接使用自带的MenuBar即可。

使用JavaFx开发一些常用的小工具

id是要跳转的fxml名字,text是菜单显示的名称。

功能项

使用JavaFx开发一些常用的小工具

实现了SHA算法,Md5算法,Json格式化,图片转base64,文字转二维码(zxing包实现),cron表达式(网页链接)。后续也会添加一些常用的功能进来。

问题点

开发环境

需要安装Jdk17,项目中有module-info文件,所以引入的类需要支持java模块化才可以。 一开始准备直接使用hutool,无法编译,因此放弃了。采用google工具集来实现。

版本匹配

二维码展示使用的google的zxing包,但是编译后会报无法初始化zxing中自带的StringUtils类,因为该类的构造方法私有了,有没有掘友知道这种情况怎么办,在module-info.java中应该怎么配置或者编译的时候如何处理😭。 目前是通过回退到低版本解决的该问题。

模块化

第一次使用模块化,感觉如果jar包没有做模块化兼容的时候,会发现无法使用和打包。比如说准备用hutool时,hutool是基于jdk8来进行构建的。新的6.0也是同步不支持的,希望hutool官方可以在MANIFEST.MF中添加Automatic-Module-Name来支持一下jdk17,否则引用的时候会比较麻烦。(第一次用模块化,熟练度也不够🤣)

打包

目前尝试了两种打包方式。

  1. 第一种先打包成jar包,在通过exe4j来进行打包成exe,可以自行设置图标,非常方便。但是有一个弊端必须在本机安装jdk17才行。
  2. 第二种直接使用gradle中的jpackage打包即可。

使用JavaFx开发一些常用的小工具

打包过后的image文件夹可以直接bin目录的app.bat启动。也可以通过jpackage下的app目录中的app.exe来进行启动。这个需要安装一个工具叫wix31,否则打包时候会报light.exe等执行文件找不到(需要配置环境变量)。

开源

工具代码我也同步在gitee上进行了公开,想使用或者接着开发的可以提PR或者自行在上面进行开发,现在还是只是一个初步开始的阶段。番茄工具集,后续公司有用到一些工具都会逐步用JavaFx进行开发。

转载自:https://juejin.cn/post/7269290896213770274
评论
请登录