diff --git a/.idea/encodings.xml b/.idea/encodings.xml index d2b8c0c..63574ec 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -3,7 +3,6 @@ - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 8a7375f..ed31708 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -61,6 +61,49 @@ + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index f63dcb6..b5edd2c 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ UTF-8 UTF-8 - 11 + 8 true @@ -49,15 +49,6 @@ jintellitype 1.4.0 - - - - org.jb2011.lnf - beautyeye - 1.0.0 - system - ${project.basedir}/src/main/resources/lib/beautyeye_lnf.jar - diff --git a/src/main/java/com/example/jmacro/wjdr/JMacro.java b/src/main/java/com/example/jmacro/wjdr/JMacro.java index 0bd888a..625abb2 100644 --- a/src/main/java/com/example/jmacro/wjdr/JMacro.java +++ b/src/main/java/com/example/jmacro/wjdr/JMacro.java @@ -39,6 +39,7 @@ public class JMacro { // 机器人初始化 this.robot = new Robot(); this.robot.setAutoDelay(100); + this.legend = new File("legend"); } public JMacro(File legend) throws AWTException { @@ -46,6 +47,14 @@ public class JMacro { this.legend = legend; } + public File getLegend() { + return legend; + } + + public void setLegend(File legend) { + this.legend = legend; + } + /** * 键盘按键组 */ diff --git a/src/main/java/com/example/jmacro/wjdr/JMacroThread.java b/src/main/java/com/example/jmacro/wjdr/JMacroThread.java index 1ddf42f..3d7fbc6 100644 --- a/src/main/java/com/example/jmacro/wjdr/JMacroThread.java +++ b/src/main/java/com/example/jmacro/wjdr/JMacroThread.java @@ -1,9 +1,10 @@ package com.example.jmacro.wjdr; +import com.example.jmacro.wjdr.base.ScreenRect; + /** * 脚本执行线程 * - * * @author wangbing * @version 0.0.1 * @since 1.8 @@ -15,4 +16,11 @@ public abstract class JMacroThread implements Runnable { public JMacroThread(JMacro jMacro) { this.jMacro = jMacro; } + + /** + * 获取视口区域 + * + * @return 视口区域 + */ + public abstract ScreenRect getScreen(); } diff --git a/src/main/java/com/example/jmacro/wjdr/JMainApplication.java b/src/main/java/com/example/jmacro/wjdr/JMainApplication.java new file mode 100644 index 0000000..4a0173b --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/JMainApplication.java @@ -0,0 +1,42 @@ +package com.example.jmacro.wjdr; + +import com.example.jmacro.wjdr.demo.DemoThread; +import com.example.jmacro.wjdr.ui.FXMLUtil; +import com.example.jmacro.wjdr.util.ResourceUtil; +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.image.Image; +import javafx.stage.Stage; + +/** + * UI入口 + */ +public class JMainApplication extends Application { + + @Override + public void start(Stage stage) throws Exception { + stage.setTitle("无限工具"); + stage.setMinWidth(400); + stage.setMinHeight(300); + FXMLLoader mainLoader = FXMLUtil.load("main.fxml"); + stage.setScene(new Scene(mainLoader.getRoot())); + stage.centerOnScreen(); + stage.show(); + stage.setOnCloseRequest(event -> { + stage.close(); + System.exit(0); + }); + // 设置图标 + Image icon = new Image(ResourceUtil.getInput("/icon.png")); + stage.getIcons().add(icon); + // 展示UI + stage.show(); + // 启动服务 + JMainService.start(); + } + + public static void main(String[] args) { + launch(args); + } +} diff --git a/src/main/java/com/example/jmacro/wjdr/JMainController.java b/src/main/java/com/example/jmacro/wjdr/JMainController.java new file mode 100644 index 0000000..258236b --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/JMainController.java @@ -0,0 +1,30 @@ +package com.example.jmacro.wjdr; + +import com.example.jmacro.wjdr.base.ScreenRect; +import com.example.jmacro.wjdr.util.Capture; +import com.example.jmacro.wjdr.util.Logger; +import javafx.fxml.FXML; + +import java.awt.*; +import java.io.File; + +public class JMainController { + + /** + * 截图 + */ + @FXML + private void onCapture() throws AWTException { + ScreenRect screen = JMainService.getInstance().getThread().getScreen(); + File legend = JMainService.getInstance().getMacro().getLegend(); + if (screen == null) { + Logger.error("请等待窗口定位"); + return; + } + try { + new Capture(screen.getLeft(), screen.getTop(), legend); + } catch (AWTException awtException) { + awtException.printStackTrace(); + } + } +} diff --git a/src/main/java/com/example/jmacro/wjdr/JMainService.java b/src/main/java/com/example/jmacro/wjdr/JMainService.java new file mode 100644 index 0000000..9075eb0 --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/JMainService.java @@ -0,0 +1,124 @@ +package com.example.jmacro.wjdr; + +import cn.hutool.core.thread.ThreadUtil; +import com.example.jmacro.wjdr.demo.DemoThread; +import com.example.jmacro.wjdr.util.Logger; + +import java.awt.*; +import java.io.File; + +/** + * 主线程 + * + * @author wangbing + * @version 0.0.1 + * @since 1.8 + */ +public class JMainService { + + private static JMainService instance; + + private JMacroThread thread; + + private JMainService() throws AWTException { + // 脚本初始化 + Logger.info("初始化脚本"); + jMacro = new JMacro(); + thread = new DemoThread(jMacro); + } + + public static synchronized JMainService getInstance() throws AWTException { + if (instance == null) { + JMainService.instance = new JMainService(); + } + return instance; + } + + public JMacroThread getThread() { + return thread; + } + + public JMacro getMacro() { + return jMacro; + } + + /** + * 脚本对象 + */ + private final JMacro jMacro; + + /** + * 服务运行状态 + */ + private boolean run; + + public static void start() throws AWTException { + // 启动服务 + Logger.info("启动服务"); + JMainService.getInstance().run = true; + // 启动后台线程 + JMainService.getInstance().serviceThread.start(); + } + + public static void stop() throws AWTException { + Logger.info("停止服务"); + JMainService.getInstance().run = false; + JMainService.getInstance().serviceThread.interrupt(); + } + + /** + * 设置图例路径 + * + * @param legend 图例路径 + */ + public void setLegend(File legend) { + if (this.jMacro != null) { + this.jMacro.setLegend(legend); + } + } + + /** + * 服务线程 + */ + public Thread serviceThread = new Thread() { + + @Override + public void run() { + while (run) { + ThreadUtil.sleep(1000); + if (thread == null) { + Logger.error("脚本线程未设置"); + continue; + } + thread.run(); + // 立即执行 +// if (noDelay) { +// if (schedule != null) { +// schedule.cancel(true); +// } +// +// noDelay = false; +// Logger.info("启动线程"); +// schedule = TaskUtil.schedule(new MacroThread(jMacro), 0, TimeUnit.SECONDS); +// continue; +// } +// if (schedule != null) { +// continue; +// } +// +// if (DateUtil.isIn(DateUtil.date(), DateUtil.parse(workStart), DateUtil.parse(workEnd))) { +// int delay = RandomUtil.randomInt(5, 20); +// Logger.info("等待{}分钟后,重新启动线程", delay); +// schedule = TaskUtil.schedule(new MacroThread(jMacro), delay, TimeUnit.MINUTES); +// } + } + } + }; + + /** + * 启动入口 + */ + public static void main(String[] args) throws AWTException { + new JMainService().start(); + } +} diff --git a/src/main/java/com/example/jmacro/wjdr/MainTask.java b/src/main/java/com/example/jmacro/wjdr/MainTask.java deleted file mode 100644 index e616c3e..0000000 --- a/src/main/java/com/example/jmacro/wjdr/MainTask.java +++ /dev/null @@ -1,258 +0,0 @@ -package com.example.jmacro.wjdr; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.img.ImgUtil; -import cn.hutool.core.thread.ThreadUtil; -import cn.hutool.core.util.RandomUtil; -import com.example.jmacro.wjdr.base.ScreenRect; -import com.example.jmacro.wjdr.task.TaskMineAttack; -import com.example.jmacro.wjdr.task.TaskMining; -import com.example.jmacro.wjdr.task.TaskRewards; -import com.example.jmacro.wjdr.util.Capture; -import com.example.jmacro.wjdr.util.Logger; -import com.example.jmacro.wjdr.util.TaskUtil; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.net.URL; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; - -/** - * 主线程 - * - * @author wangbing - * @version 0.0.1 - * @since 1.8 - */ -public class MainTask extends JFrame { - - /** - * 脚本线程 - */ - private static ScheduledFuture schedule; - - /** - * 工作开始时间 - */ - private final String workStart = "08:00:00"; - - /** - * 工作结束时间 - */ - private final String workEnd = "24:00:00"; - - private boolean noDelay = true; - - /** - * 脚本对象 - */ - private JMacro jMacro; - - /** - * 主屏幕区域 - */ - private ScreenRect gameScreen; - - public void start() throws AWTException { - // 加载主题 - try { - org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF(); - } catch (Exception e) { - e.printStackTrace(); - } - // 设置标题 - setTitle("无限工具"); - // 设置图标 - URL icon = this.getClass().getClassLoader().getResource("icon.png"); - setIconImage(ImgUtil.read(icon)); - // 脚本初始化 - Logger.info("初始化脚本"); - jMacro = new JMacro(new File("legend")); - // 设置窗口的宽度和高度 - setSize(400, 300); // 设置窗口的宽度为400像素,高度为300像素 - // 添加一个标签作为示例内容 - JButton button = new JButton(); - button.setText("采图"); - button.setSize(100, 40); - button.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - super.mouseClicked(e); - if (gameScreen == null) { - Logger.error("请等待窗口定位"); - return; - } - try { - new Capture(gameScreen.getLeft(), gameScreen.getTop(), new File("legend")); - } catch (AWTException awtException) { - awtException.printStackTrace(); - } - } - }); - getContentPane().add(button); - // 设置窗口关闭时的操作 - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - // 启动后台线程 - startBack(); - center(); - // 显示窗口 - setVisible(true); - } - - /** - * 居中 - */ - private void center() { - // 获取屏幕尺寸 - java.awt.Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - // 获取窗口尺寸 - java.awt.Dimension frameSize = getSize(); - // 计算窗口居中位置 - setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); - } - - /** - * 后台线程 - */ - public void startBack() { - Logger.setDebug(true); - - new Thread(() -> { - while (true) { - ThreadUtil.sleep(1000); - - // 立即执行 - if (noDelay) { - if (schedule != null) { - schedule.cancel(true); - } - - noDelay = false; - Logger.info("启动线程"); - schedule = TaskUtil.schedule(new MacroThread(jMacro), 0, TimeUnit.SECONDS); - continue; - } - if (schedule != null) { - continue; - } - - if (DateUtil.isIn(DateUtil.date(), DateUtil.parse(workStart), DateUtil.parse(workEnd))) { - int delay = RandomUtil.randomInt(5, 20); - Logger.info("等待{}分钟后,重新启动线程", delay); - schedule = TaskUtil.schedule(new MacroThread(jMacro), delay, TimeUnit.MINUTES); - } - } - }).start(); - } - - /** - * 主线程实现 - */ - public class MacroThread extends JMacroThread { - - public MacroThread(JMacro jMacro) { - super(jMacro); - } - - @Override - public void run() { - // 定位mumu bar - Logger.info("定位慕慕窗口"); - ScreenRect mumu = jMacro.findPic("慕慕_工具栏", 0.95d); - if (mumu == null) { - throw new IllegalStateException("未检测到MuMu,请开启MuMu模拟器"); - } - Logger.info("定位慕慕窗口成功"); - // 计算应用窗口返回 - gameScreen = new ScreenRect(); - gameScreen.setLeft(mumu.getLeft() - 428); - gameScreen.setTop(mumu.getBottom() + 7); - gameScreen.setRight(mumu.getRight()); - gameScreen.setBottom(mumu.getBottom() + 951); - Logger.info("应用窗口位置:" + gameScreen.toString()); - Logger.info("应用窗口大小:{}x{}", gameScreen.getRight() - gameScreen.getLeft(), gameScreen.getBottom() - gameScreen.getTop()); - // 获取启动图标 - Logger.info("定位启动图标"); - ScreenRect launch = jMacro.waitAndFindPic(gameScreen, "启动图标", 0.8); - if (launch != null) { - Logger.info("启动图标坐标:", launch.toString()); - Logger.info("启动程序"); - jMacro.delay(); - jMacro.mouseLeftClick(launch); - } else { - Logger.info("启动图标失败,继续定位主界面"); - } - Logger.info("定位主界面"); - ScreenRect 城镇 = TaskUtil.timeTask(() -> { - while (true) { - jMacro.delay(); - { // 定位弹框,关闭弹框 - Logger.info("检测到广告弹框"); - ScreenRect rect = jMacro.matchPic(gameScreen, "城镇_充值_L448,36", 0.8d); - if (rect != null) { - jMacro.mouseLeftClick(rect); - Logger.info("检测到广告弹框,关闭弹框"); - } - } - - jMacro.delay(); - { // 定位离线收益弹框,关闭弹框 - ScreenRect rect = jMacro.matchPic(gameScreen, "城镇_离线收益_L204,734", 0.9); - if (rect != null) { - jMacro.mouseLeftClick(rect); - Logger.info("检测到离线收益弹框,关闭弹框"); - } - } - - jMacro.delay(); - // 定位主程序 - ScreenRect rect = jMacro.matchPic(gameScreen, "野外_L444,888", 0.9); - if (rect != null) { - Logger.info("程序主界面已就绪"); - return rect; - } - } - }, 30, TimeUnit.SECONDS); - - if (城镇 == null) { - schedule.cancel(true); - schedule = null; - Logger.info("未扫描到主界面:退出线程"); - - return; - } - - Logger.info("进入主界面"); - - Logger.info("进入任务线程"); - TaskUtil.timeTask((Runnable) () -> { - while (true) { - - // 矿场攻击检测任务 - jMacro.delayNormal(); - new TaskMineAttack(jMacro, gameScreen).run(); - - // 矿场攻击检测任务 - jMacro.delayNormal(); - new TaskRewards(jMacro, gameScreen).run(); - - // 自动采矿任务 - jMacro.delayNormal(); - new TaskMining(jMacro, gameScreen).run(); - - } - }, 10, TimeUnit.MINUTES); - } - } - - /** - * 启动入口 - */ - public static void main(String[] args) throws AWTException { - new MainTask().start(); - } -} diff --git a/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java b/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java new file mode 100644 index 0000000..42580d7 --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/demo/DemoThread.java @@ -0,0 +1,138 @@ +package com.example.jmacro.wjdr.demo; + +import com.example.jmacro.wjdr.JMacro; +import com.example.jmacro.wjdr.JMacroThread; +import com.example.jmacro.wjdr.base.ScreenRect; +import com.example.jmacro.wjdr.demo.task.TaskMineAttack; +import com.example.jmacro.wjdr.demo.task.TaskMining; +import com.example.jmacro.wjdr.demo.task.TaskRewards; +import com.example.jmacro.wjdr.util.Logger; +import com.example.jmacro.wjdr.util.TaskUtil; + +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public class DemoThread extends JMacroThread { + + /** + * 视口 + */ + private ScreenRect gameScreen; + + /** + * 脚本线程 + */ + private static ScheduledFuture schedule; + + /** + * 工作开始时间 + */ + private final String workStart = "08:00:00"; + + /** + * 工作结束时间 + */ + private final String workEnd = "24:00:00"; + + /** + * 是否立即执行 + */ + private boolean noDelay = true; + + public DemoThread(JMacro jMacro) { + super(jMacro); + } + + @Override + public ScreenRect getScreen() { + return gameScreen; + } + + @Override + public void run() { + // 定位mumu bar + Logger.info("定位慕慕窗口"); + ScreenRect mumu = jMacro.findPic("慕慕_工具栏", 0.95d); + if (mumu == null) { + throw new IllegalStateException("未检测到MuMu,请开启MuMu模拟器"); + } + Logger.info("定位慕慕窗口成功"); + // 计算应用窗口返回 + gameScreen = new ScreenRect(); + gameScreen.setLeft(mumu.getLeft() - 428); + gameScreen.setTop(mumu.getBottom() + 7); + gameScreen.setRight(mumu.getRight()); + gameScreen.setBottom(mumu.getBottom() + 951); + Logger.info("应用窗口位置:" + gameScreen.toString()); + Logger.info("应用窗口大小:{}x{}", gameScreen.getRight() - gameScreen.getLeft(), gameScreen.getBottom() - gameScreen.getTop()); + // 获取启动图标 + Logger.info("定位启动图标"); + ScreenRect launch = jMacro.waitAndFindPic(gameScreen, "启动图标", 0.8); + if (launch != null) { + Logger.info("启动图标坐标:", launch.toString()); + Logger.info("启动程序"); + jMacro.delay(); + jMacro.mouseLeftClick(launch); + } else { + Logger.info("启动图标失败,继续定位主界面"); + } + Logger.info("定位主界面"); + ScreenRect 城镇 = TaskUtil.timeTask(() -> { + while (true) { + jMacro.delay(); + { // 定位弹框,关闭弹框 + Logger.info("检测到广告弹框"); + ScreenRect rect = jMacro.matchPic(gameScreen, "城镇_充值_L448,36", 0.8d); + if (rect != null) { + jMacro.mouseLeftClick(rect); + Logger.info("检测到广告弹框,关闭弹框"); + } + } + + jMacro.delay(); + { // 定位离线收益弹框,关闭弹框 + ScreenRect rect = jMacro.matchPic(gameScreen, "城镇_离线收益_L204,734", 0.9); + if (rect != null) { + jMacro.mouseLeftClick(rect); + Logger.info("检测到离线收益弹框,关闭弹框"); + } + } + + jMacro.delay(); + // 定位主程序 + ScreenRect rect = jMacro.matchPic(gameScreen, "野外_L444,888", 0.9); + if (rect != null) { + Logger.info("程序主界面已就绪"); + return rect; + } + } + }, 30, TimeUnit.SECONDS); + + if (城镇 == null) { + schedule.cancel(true); + schedule = null; + Logger.info("未扫描到主界面:退出线程"); + + return; + } + + Logger.info("进入主界面"); + + Logger.info("进入任务线程"); + TaskUtil.timeTask((Runnable) () -> { + while (true) { + // 矿场攻击检测任务 + jMacro.delayNormal(); + new TaskMineAttack(jMacro, gameScreen).run(); + + // 矿场攻击检测任务 + jMacro.delayNormal(); + new TaskRewards(jMacro, gameScreen).run(); + + // 自动采矿任务 + jMacro.delayNormal(); + new TaskMining(jMacro, gameScreen).run(); + } + }, 10, TimeUnit.MINUTES); + } +} diff --git a/src/main/java/com/example/jmacro/wjdr/task/BaseTask.java b/src/main/java/com/example/jmacro/wjdr/demo/task/BaseTask.java similarity index 90% rename from src/main/java/com/example/jmacro/wjdr/task/BaseTask.java rename to src/main/java/com/example/jmacro/wjdr/demo/task/BaseTask.java index 1b6de0a..71d0391 100644 --- a/src/main/java/com/example/jmacro/wjdr/task/BaseTask.java +++ b/src/main/java/com/example/jmacro/wjdr/demo/task/BaseTask.java @@ -1,4 +1,4 @@ -package com.example.jmacro.wjdr.task; +package com.example.jmacro.wjdr.demo.task; import com.example.jmacro.wjdr.JMacro; import com.example.jmacro.wjdr.base.ScreenRect; diff --git a/src/main/java/com/example/jmacro/wjdr/task/TaskMineAttack.java b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMineAttack.java similarity index 92% rename from src/main/java/com/example/jmacro/wjdr/task/TaskMineAttack.java rename to src/main/java/com/example/jmacro/wjdr/demo/task/TaskMineAttack.java index da9b6c5..4ccf0c4 100644 --- a/src/main/java/com/example/jmacro/wjdr/task/TaskMineAttack.java +++ b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMineAttack.java @@ -1,4 +1,4 @@ -package com.example.jmacro.wjdr.task; +package com.example.jmacro.wjdr.demo.task; import com.example.jmacro.wjdr.JMacro; import com.example.jmacro.wjdr.base.ScreenRect; diff --git a/src/main/java/com/example/jmacro/wjdr/task/TaskMining.java b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMining.java similarity index 99% rename from src/main/java/com/example/jmacro/wjdr/task/TaskMining.java rename to src/main/java/com/example/jmacro/wjdr/demo/task/TaskMining.java index 8e93f72..57af0b0 100644 --- a/src/main/java/com/example/jmacro/wjdr/task/TaskMining.java +++ b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskMining.java @@ -1,4 +1,4 @@ -package com.example.jmacro.wjdr.task; +package com.example.jmacro.wjdr.demo.task; import cn.hutool.json.JSONUtil; import com.example.jmacro.wjdr.JMacro; diff --git a/src/main/java/com/example/jmacro/wjdr/task/TaskRewards.java b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskRewards.java similarity index 98% rename from src/main/java/com/example/jmacro/wjdr/task/TaskRewards.java rename to src/main/java/com/example/jmacro/wjdr/demo/task/TaskRewards.java index 229aeb8..27b52a0 100644 --- a/src/main/java/com/example/jmacro/wjdr/task/TaskRewards.java +++ b/src/main/java/com/example/jmacro/wjdr/demo/task/TaskRewards.java @@ -1,4 +1,4 @@ -package com.example.jmacro.wjdr.task; +package com.example.jmacro.wjdr.demo.task; import com.example.jmacro.wjdr.JMacro; import com.example.jmacro.wjdr.base.ScreenRect; diff --git a/src/main/java/com/example/jmacro/wjdr/ui/FXMLUtil.java b/src/main/java/com/example/jmacro/wjdr/ui/FXMLUtil.java new file mode 100644 index 0000000..2d55f94 --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/ui/FXMLUtil.java @@ -0,0 +1,31 @@ +package com.example.jmacro.wjdr.ui; + +import com.example.jmacro.wjdr.util.ResourceUtil; +import javafx.fxml.FXMLLoader; + +import java.io.IOException; +import java.net.URL; + +/** + * FXML工具 + */ +public class FXMLUtil { + + /** + * 加载FXMLLoader + * + * @param fxml 资源路径 + * @return + */ + public static FXMLLoader load(String fxml) throws IOException { + if (!fxml.startsWith("classpath:")) { + fxml = "classpath:" + fxml; + } + URL resource = ResourceUtil.getURL(fxml); + FXMLLoader fxmlLoader = new FXMLLoader(resource); + fxmlLoader.load(); + return fxmlLoader; + } + + +} diff --git a/src/main/java/com/example/jmacro/wjdr/util/ResourceUtil.java b/src/main/java/com/example/jmacro/wjdr/util/ResourceUtil.java new file mode 100644 index 0000000..510d97e --- /dev/null +++ b/src/main/java/com/example/jmacro/wjdr/util/ResourceUtil.java @@ -0,0 +1,58 @@ +package com.example.jmacro.wjdr.util; + +import cn.hutool.core.io.resource.ClassPathResource; +import javafx.fxml.FXMLLoader; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; + +/** + * 资源工具 + */ +public class ResourceUtil extends cn.hutool.core.io.resource.ResourceUtil { + + /** + * 获取资源输入流,以/开始 + * + * @return 资源路径 + */ + public static InputStream getInput(String resourceLocation) { + if (resourceLocation.startsWith("/")) { + resourceLocation = "/" + resourceLocation; + } + ClassPathResource classPathResource = new ClassPathResource(resourceLocation); + return classPathResource.getStream(); + } + + /** + * 获取资源路径 + * + * @param resourceLocation 资源 + */ + public static URL getURL(String resourceLocation) throws FileNotFoundException { + if (resourceLocation.startsWith("classpath:")) { + String path = resourceLocation.substring("classpath:".length()); + ClassLoader cl = FXMLLoader.getDefaultClassLoader(); + URL url = cl != null ? cl.getResource(path) : ClassLoader.getSystemResource(path); + if (url == null) { + String description = "class path resource [" + path + "]"; + throw new FileNotFoundException(description + " cannot be resolved to URL because it does not exist"); + } else { + return url; + } + } else { + try { + return new URL(resourceLocation); + } catch (MalformedURLException var6) { + try { + return (new File(resourceLocation)).toURI().toURL(); + } catch (MalformedURLException var5) { + throw new FileNotFoundException("Resource location [" + resourceLocation + "] is neither a URL not a well-formed file path"); + } + } + } + } +} diff --git a/src/main/resources/lib/beautyeye_lnf.jar b/src/main/resources/lib/beautyeye_lnf.jar deleted file mode 100644 index b539624..0000000 Binary files a/src/main/resources/lib/beautyeye_lnf.jar and /dev/null differ diff --git a/src/main/resources/main.fxml b/src/main/resources/main.fxml new file mode 100644 index 0000000..c145989 --- /dev/null +++ b/src/main/resources/main.fxml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +