From 7390de076cce0c29aad46711f04809ee1a4ca35a Mon Sep 17 00:00:00 2001 From: zhangmeng <1334717033@qq.com> Date: Wed, 17 May 2023 16:41:05 +0800 Subject: [PATCH] =?UTF-8?q?2023=E5=B9=B45=E6=9C=8817=E6=97=A516:40:02?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 + .../controller/CapterScreenController.java | 260 ++++++++++++++++++ .../controller/CodecToolsController.java | 34 ++- .../tools/controller/HomeController.java | 4 + .../tools/controller/HttpToolsController.java | 28 ++ .../controller/NetWorkToolsController.java | 28 ++ .../controller/SmallToolsController.java | 68 +++++ .../tools/controller/SqlToolsController.java | 44 +++ .../zhangmeng/tools/utils/ResourcesUtils.java | 1 + src/main/resources/fxml/capter-screen.fxml | 16 ++ src/main/resources/fxml/codec-tools.fxml | 1 + src/main/resources/fxml/home.fxml | 1 + src/main/resources/fxml/http-tools.fxml | 20 +- src/main/resources/fxml/network-tools.fxml | 19 +- src/main/resources/fxml/small-tools.fxml | 16 +- src/main/resources/fxml/sql-tools.fxml | 12 + 16 files changed, 543 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/zhangmeng/tools/controller/CapterScreenController.java create mode 100644 src/main/resources/fxml/capter-screen.fxml diff --git a/pom.xml b/pom.xml index 265eb79..9c1d75a 100644 --- a/pom.xml +++ b/pom.xml @@ -211,6 +211,13 @@ 19 + + + org.openjfx + javafx-swing + 19 + + com.github.leewyatt rxcontrols diff --git a/src/main/java/com/zhangmeng/tools/controller/CapterScreenController.java b/src/main/java/com/zhangmeng/tools/controller/CapterScreenController.java new file mode 100644 index 0000000..aaf5138 --- /dev/null +++ b/src/main/java/com/zhangmeng/tools/controller/CapterScreenController.java @@ -0,0 +1,260 @@ +package com.zhangmeng.tools.controller; + +import javafx.embed.swing.SwingFXUtils; +import javafx.fxml.FXML; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.image.ImageView; +import javafx.scene.image.WritableImage; +import javafx.scene.input.*; +import javafx.scene.layout.*; +import javafx.scene.paint.Paint; +import javafx.stage.Stage; +import javafx.stage.StageStyle; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; + +/** + * @author : 芊芊墨客 + * @version : 1.0 + * @date : 2023-05-17 14:29 + */ +@Slf4j +public class CapterScreenController { + + @FXML + public Button bu; + + @FXML + public AnchorPane iv_root; + + @FXML + private ImageView iv; //切成的图片展示区域 + + private Stage primaryStage; //主舞台 + private Stage stage; //切图时候的辅助舞台 + private double start_x; //切图区域的起始位置x + private double start_y; //切图区域的起始位置y + private double w; //切图区域宽 + private double h; //切图区域高 + private HBox hBox; //切图区域 + + + @FXML + public void initialize() { + + iv_root.setBorder(new Border(new BorderStroke(Paint.valueOf("#c03700"), BorderStrokeStyle.SOLID, + null, new BorderWidths(1)))); + + //为点击截图按钮绑定事件 + bu.setOnAction(event -> { + show(); + }); + //绑定截图快捷键,使用快捷键达到点击按钮的目的 + KeyCombination keyCombination = KeyCombination.valueOf("ctrl+alt+p"); + + // 处理快捷键事件 + Runnable action = this::show; + + bu.setOnKeyPressed(event -> { + if (keyCombination.match(event)) { + action.run(); + event.consume(); + } + }); + } + + /** + * 显示截图操作舞台并绑定鼠标截图事件 + */ + public void show() { + + this.primaryStage = (Stage) bu.getScene().getWindow(); + + //将主舞台缩放到任务栏 + primaryStage.setIconified(true); + //创建辅助舞台,并设置场景与布局 + stage = new Stage(); + //锚点布局采用半透明 + AnchorPane anchorPane = new AnchorPane(); + anchorPane.setStyle("-fx-background-color: #85858522"); + //场景设置白色全透明 + Scene scene = new Scene(anchorPane); + scene.setFill(Paint.valueOf("#ffffff00")); + stage.setScene(scene); + //清楚全屏中间提示文字 + stage.setFullScreenExitHint(""); + stage.initStyle(StageStyle.TRANSPARENT); + stage.setFullScreen(true); + stage.show(); + + //切图窗口绑定鼠标按下事件 + anchorPane.setOnMousePressed(event -> { + //清除锚点布局中所有子元素 + anchorPane.getChildren().clear(); + //创建切图区域 + hBox = new HBox(); + //设置背景保证能看到切图区域桌面 + hBox.setBackground(null); + //设置边框 + hBox.setBorder(new Border(new BorderStroke(Paint.valueOf("#c03700"), BorderStrokeStyle.SOLID, + null, new BorderWidths(1)))); + anchorPane.getChildren().add(hBox); + //记录并设置起始位置 + start_x = event.getSceneX(); + start_y = event.getSceneY(); + AnchorPane.setLeftAnchor(hBox, start_x); + AnchorPane.setTopAnchor(hBox, start_y); + }); + //绑定鼠标按下拖拽的事件 + anchorPane.setOnMouseDragged(event -> { + //用label记录切图区域的长宽 + Label label = new Label(); + label.setAlignment(Pos.CENTER); + label.setPrefHeight(30); + label.setPrefWidth(170); + anchorPane.getChildren().add(label); + AnchorPane.setLeftAnchor(label, start_x + 30); + AnchorPane.setTopAnchor(label, start_y); + label.setTextFill(Paint.valueOf("#ffffff"));//白色填充 + label.setStyle("-fx-background-color: #000000");//黑背景 + //计算宽高并且完成切图区域的动态效果 + w = Math.abs(event.getSceneX() - start_x); + h = Math.abs(event.getSceneY() - start_y); + hBox.setPrefWidth(w); + hBox.setPrefHeight(h); + label.setText("宽:" + w + " 高:" + h); + }); + + //绑定鼠标松开事件 + anchorPane.setOnMouseReleased(event -> { + //记录最终长宽 + w = Math.abs(event.getSceneX() - start_x); + h = Math.abs(event.getSceneY() - start_y); + anchorPane.setStyle("-fx-background-color: #00000000"); + //添加剪切按钮,并显示在切图区域的底部 + Button b = new Button("剪切"); + hBox.setBorder(new Border(new BorderStroke(Paint.valueOf("#85858544"), BorderStrokeStyle.SOLID, + null, new BorderWidths(1)))); + + //绑定截图快捷键,使用快捷键达到点击按钮的目的 + KeyCombination keyCombination = new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_DOWN); + Runnable action = () -> { + // 处理快捷键事件 + //切图辅助舞台小时 + stage.close(); + try { + //切图具体方法 + capterImg(); + } catch (Exception e) { + e.printStackTrace(); + } + //主舞台还原 + primaryStage.setIconified(false); + }; + b.setOnKeyPressed(e -> { + if (keyCombination.match(e)) { + action.run(); + e.consume(); + } + }); + + hBox.getChildren().add(b); + hBox.setAlignment(Pos.BOTTOM_RIGHT); + //为切图按钮绑定切图事件 + b.setOnAction(event1 -> { + //切图辅助舞台小时 + stage.close(); + try { + //切图具体方法 + capterImg(); + } catch (Exception e) { + e.printStackTrace(); + } + //主舞台还原 + primaryStage.setIconified(false); + }); + }); + + scene.setOnKeyPressed(event -> { + if (event.getCode() == KeyCode.ESCAPE) { + stage.close(); + primaryStage.setIconified(false); + } + }); + } + /** + * 处理截屏与图像的保存 + * + * @throws Exception + */ + public void capterImg() throws Exception { + //利用awt中的方法,通过记录的起始点和长宽完成屏幕截图 + Robot robot = new Robot(); + Rectangle re = new Rectangle((int) start_x, (int) start_y, (int) w, (int) h); + BufferedImage screenCapture = robot.createScreenCapture(re); + //截图图片背景透明处理 + //BufferedImage bufferedImage = transferAlpha(screenCapture); + //不进行背景透明处理 + //转换图片格式展示在主舞台的场景中 + WritableImage writableImage = SwingFXUtils.toFXImage(screenCapture, null); + + iv.setFitWidth(iv_root.getPrefWidth() + 150); + iv.setFitHeight(iv_root.getPrefHeight() + 120 ); + + iv.setImage(writableImage); + + //将截图内容,放入系统剪切板 + Clipboard cb = Clipboard.getSystemClipboard(); + ClipboardContent content = new ClipboardContent(); + content.putImage(writableImage); + cb.setContent(content); + + //将截取图片放入到系统固定位置 + ImageIO.write(screenCapture, "png", new File("E:/capter.png")); + + } + + /** + * 背景透明处理 + * + * @param img + * @return + */ + public static BufferedImage transferAlpha(BufferedImage img) { + BufferedImage bufferedImage = null; + try { + //取左上角点作为背景点 + int RGB = img.getRGB(img.getMinX(), img.getMinY()); + int R = (RGB & 0xff0000) >> 16; + int G = (RGB & 0xff00) >> 8; + int B = (RGB & 0xff); + bufferedImage = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB); + for (int j1 = img.getMinY(); j1 < img.getHeight(); j1++) { + //遍历一行中的rgb三通道像素点, + for (int j2 = img.getMinX(); j2 < img.getWidth(); j2++) { + //获取固定点的rgb值 + int rgb = img.getRGB(j2, j1); + int r = (rgb & 0xff0000) >> 16; + int g = (rgb & 0xff00) >> 8; + int b = (rgb & 0xff); + if ((Math.abs(r - R) < 15) && (Math.abs(g - G) < 15) && (Math.abs(b - B) < 15)) { + rgb = (1 << 24) | (rgb & 0x00ffffff); + } + //设置固定点的rgb值 + bufferedImage.setRGB(j2, j1, rgb); + } + + } + } catch (Exception e) { + e.printStackTrace(); + } + return bufferedImage; + } +} diff --git a/src/main/java/com/zhangmeng/tools/controller/CodecToolsController.java b/src/main/java/com/zhangmeng/tools/controller/CodecToolsController.java index da5b5ef..1e54f09 100644 --- a/src/main/java/com/zhangmeng/tools/controller/CodecToolsController.java +++ b/src/main/java/com/zhangmeng/tools/controller/CodecToolsController.java @@ -564,26 +564,50 @@ public class CodecToolsController { } public void jks_file_menu_item(ActionEvent event) { - + load_encrypt(2); } public void music_parser_menu_item(ActionEvent event) { - + load_player(3); } public void word_ocr_menu_item(ActionEvent event) { - + load_small_tools(11); } public void bar_code_menu_item(ActionEvent event) { - + load_small_tools(12); } public void pdf_menu_item(ActionEvent event) { - + load_small_tools(13); } public void batch_update_file_name_menu_item(ActionEvent event) { + load_small_tools(14); + } + public void capter_screen_menu_item(ActionEvent event) { + load_small_tools(15); + } + + public void json_javabean_gen_menu_item(ActionEvent event) { + load_sql_tools(2); + } + + public void socket_client_aio_menu_item(ActionEvent event) { + load_server_tools(4); + } + + public void socket_server_aio_menu_item(ActionEvent event) { + load_server_tools(5); + } + + public void socket_server_nio_menu_item(ActionEvent event) { + load_server_tools(6); + } + + public void socket_client_nio_menu_item(ActionEvent event) { + load_server_tools(7); } } diff --git a/src/main/java/com/zhangmeng/tools/controller/HomeController.java b/src/main/java/com/zhangmeng/tools/controller/HomeController.java index 6676d32..724c7e7 100644 --- a/src/main/java/com/zhangmeng/tools/controller/HomeController.java +++ b/src/main/java/com/zhangmeng/tools/controller/HomeController.java @@ -562,4 +562,8 @@ public class HomeController implements Serializable { public void socket_client_nio_menu_item(ActionEvent event) { load_server_tools(7); } + + public void capter_screen_menu_item(ActionEvent event) { + load_small_tools(14); + } } \ No newline at end of file diff --git a/src/main/java/com/zhangmeng/tools/controller/HttpToolsController.java b/src/main/java/com/zhangmeng/tools/controller/HttpToolsController.java index aad06b3..fa52243 100644 --- a/src/main/java/com/zhangmeng/tools/controller/HttpToolsController.java +++ b/src/main/java/com/zhangmeng/tools/controller/HttpToolsController.java @@ -498,4 +498,32 @@ public class HttpToolsController { public void maven_jar_install_menu_item(ActionEvent event) { load_small_tools(10); } + + public void jks_file_menu_item(ActionEvent event) { + load_encrypt(2); + } + + public void music_parser_menu_item(ActionEvent event) { + load_player(3); + } + + public void word_ocr_menu_item(ActionEvent event) { + load_small_tools(11); + } + + public void bar_code_menu_item(ActionEvent event) { + load_small_tools(12); + } + + public void pdf_menu_item(ActionEvent event) { + load_small_tools(13); + } + + public void batch_update_file_name_menu_item(ActionEvent event) { + load_small_tools(14); + } + + public void capter_screen_menu_item(ActionEvent event) { + load_small_tools(15); + } } diff --git a/src/main/java/com/zhangmeng/tools/controller/NetWorkToolsController.java b/src/main/java/com/zhangmeng/tools/controller/NetWorkToolsController.java index 313f29e..23534d1 100644 --- a/src/main/java/com/zhangmeng/tools/controller/NetWorkToolsController.java +++ b/src/main/java/com/zhangmeng/tools/controller/NetWorkToolsController.java @@ -430,4 +430,32 @@ public class NetWorkToolsController { public void maven_jar_install_menu_item(ActionEvent event) { load_small_tools(10); } + + public void jks_file_menu_item(ActionEvent event) { + load_encrypt_tools(2); + } + + public void music_parser_menu_item(ActionEvent event) { + load_player(3); + } + + public void word_ocr_menu_item(ActionEvent event) { + load_small_tools(11); + } + + public void bar_code_menu_item(ActionEvent event) { + load_small_tools(12); + } + + public void pdf_menu_item(ActionEvent event) { + load_small_tools(13); + } + + public void batch_update_file_name_menu_item(ActionEvent event) { + load_small_tools(14); + } + + public void capter_screen_menu_item(ActionEvent event) { + load_small_tools(15); + } } diff --git a/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java b/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java index 95525cd..8d4214e 100644 --- a/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java +++ b/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java @@ -82,6 +82,7 @@ public class SmallToolsController { private AnchorPane bar_code; private AnchorPane pdf_ocr; private AnchorPane batch_update_file_name; + private AnchorPane capter_screen; @FXML private ListView listView; @@ -394,6 +395,20 @@ public class SmallToolsController { } pdf_ocr(flag); } + + if (newValue.getIndex() == 14) { + if (batch_update_file_name != null) { + flag = true; + } + batch_update_file_name(flag); + } + + if (newValue.getIndex() == 15) { + if (capter_screen != null) { + flag = true; + } + capter_screen(flag); + } } }); } @@ -418,6 +433,7 @@ public class SmallToolsController { case Bar_Code -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE)); case Pdf_Ocr -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE)); case BatchUpdateFileName -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE)); + case Capter_Screent -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE)); }; } @@ -734,6 +750,22 @@ public class SmallToolsController { common_method(); } + public void capter_screen(boolean flag){ + //默认选择第一个 + listView.getSelectionModel().select(15); + + if (!flag) { + try { + root = FXMLLoader.load(ResourcesUtils.getResource("capter-screen")); + } catch (IOException e) { + e.printStackTrace(); + } + batch_update_file_name = root; + } else { + root = batch_update_file_name; + } + common_method(); + } private void common_method() { splitPane.getItems().remove(1); @@ -910,4 +942,40 @@ public class SmallToolsController { } pdf_ocr(flag); } + + public void capter_screen_menu_item(ActionEvent event) { + boolean flag = false; + if (capter_screen != null){ + flag = true; + } + capter_screen(flag); + } + + public void jks_file_menu_item(ActionEvent event) { + load_encrypt(2); + } + + public void music_parser_menu_item(ActionEvent event) { + load_player(3); + } + + public void json_javabean_gen_menu_item(ActionEvent event) { + load_mysql_tools(2); + } + + public void socket_client_aio_menu_item(ActionEvent event) { + load_server_tools(4); + } + + public void socket_server_aio_menu_item(ActionEvent event) { + load_server_tools(5); + } + + public void socket_server_nio_menu_item(ActionEvent event) { + load_server_tools(6); + } + + public void socket_client_nio_menu_item(ActionEvent event) { + load_server_tools(7); + } } diff --git a/src/main/java/com/zhangmeng/tools/controller/SqlToolsController.java b/src/main/java/com/zhangmeng/tools/controller/SqlToolsController.java index 3f3197b..2ccfccd 100644 --- a/src/main/java/com/zhangmeng/tools/controller/SqlToolsController.java +++ b/src/main/java/com/zhangmeng/tools/controller/SqlToolsController.java @@ -506,4 +506,48 @@ public class SqlToolsController { public void spring_security_menu_item(ActionEvent event) { load_codec_tools(1); } + + public void jks_file_menu_item(ActionEvent event) { + load_codec_tools(2); + } + + public void music_parser_menu_item(ActionEvent event) { + load_player(3); + } + + public void word_ocr_menu_item(ActionEvent event) { + load_small_tools(11); + } + + public void bar_code_menu_item(ActionEvent event) { + load_small_tools(12); + } + + public void pdf_menu_item(ActionEvent event) { + load_small_tools(13); + } + + public void batch_update_file_name_menu_item(ActionEvent event) { + load_small_tools(14); + } + + public void capter_screen_menu_item(ActionEvent event) { + load_small_tools(15); + } + + public void socket_client_aio_menu_item(ActionEvent event) { + load_server_tools(4); + } + + public void socket_server_aio_menu_item(ActionEvent event) { + load_server_tools(5); + } + + public void socket_server_nio_menu_item(ActionEvent event) { + load_server_tools(6); + } + + public void socket_client_nio_menu_item(ActionEvent event) { + load_server_tools(7); + } } diff --git a/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java b/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java index 2875ed6..19ec9b9 100644 --- a/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java +++ b/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java @@ -130,6 +130,7 @@ public class ResourcesUtils { Bar_Code("条形码识别", 12), Pdf_Ocr("pdf识别", 13), BatchUpdateFileName("批量修改文件名", 14), + Capter_Screent("截图", 15), ; SmallTools(String title, int index) { diff --git a/src/main/resources/fxml/capter-screen.fxml b/src/main/resources/fxml/capter-screen.fxml new file mode 100644 index 0000000..d3b1834 --- /dev/null +++ b/src/main/resources/fxml/capter-screen.fxml @@ -0,0 +1,16 @@ + + + + + + + + +