当前位置: 首页 > news >正文

手搓一个记录复制记录的软件,方便快速找到之前复制内容

工作中经常有复制的诉求,当多次复制的时候,去找之前复制的内容就比较麻烦。市面上的要不是不好用,要不是就是不免费。于是打算手搓一个记录复制记录的软件,方便快速找到之前复制内容,效果还是很不错。直接贴代码
下面是完整版代码:


import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedList;
import java.util.concurrent.TimeUnit;public class ClipboardHistory extends JFrame {private static final int MAX_HISTORY = 100;private final DefaultListModel<String> listModel = new DefaultListModel<>();private final LinkedList<String> history = new LinkedList<>();private final JList<String> historyList = new JList<>(listModel);public ClipboardHistory() {setTitle("剪贴板历史记录器");setDefaultCloseOperation(EXIT_ON_CLOSE);setSize(500, 400);setLocationRelativeTo(null);JScrollPane scrollPane = new JScrollPane(historyList);JButton copyBtn = new JButton("复制到剪贴板");copyBtn.addActionListener(e -> copySelectedToClipboard());JButton deleteBtn = new JButton("删除选中内容");deleteBtn.addActionListener(e -> deleteSelectedItem());JPanel btnPanel = new JPanel();btnPanel.add(copyBtn);btnPanel.add(deleteBtn);JPanel panel = new JPanel(new BorderLayout());panel.add(scrollPane, BorderLayout.CENTER);panel.add(btnPanel, BorderLayout.SOUTH);add(panel);// 鼠标双击复制historyList.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent evt) {if (evt.getClickCount() == 2) {copySelectedToClipboard();}}});// 剪贴板监听线程new Thread(this::watchClipboard).start();}private void watchClipboard() {Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();Transferable prev = null;while (true) {try {Transferable curr = clipboard.getContents(null);if (curr != null && curr.isDataFlavorSupported(DataFlavor.stringFlavor)) {String data = (String) curr.getTransferData(DataFlavor.stringFlavor);if (!data.trim().isEmpty() && (prev == null || !data.equals(getTransferableString(prev)))) {addHistory(data);prev = curr;}}TimeUnit.MILLISECONDS.sleep(500);} catch (Exception e) {// 忽略异常}}}private String getTransferableString(Transferable t) {try {return t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)? (String) t.getTransferData(DataFlavor.stringFlavor) : null;} catch (Exception e) {return null;}}private void addHistory(String text) {SwingUtilities.invokeLater(() -> {if (history.contains(text)) {return; }// 去重history.addFirst(text);if (history.size() > MAX_HISTORY) {history.removeLast();}refreshList();});}private void refreshList() {listModel.clear();for (String s : history){ listModel.addElement(s);}}private void copySelectedToClipboard() {String selected = historyList.getSelectedValue();if (selected != null) {StringSelection sel = new StringSelection(selected);Toolkit.getDefaultToolkit().getSystemClipboard().setContents(sel, null);}}private void deleteSelectedItem() {int idx = historyList.getSelectedIndex();if (idx >= 0) {String item = listModel.getElementAt(idx);history.remove(item);refreshList();// 维持选择状态if (idx < listModel.size()) {historyList.setSelectedIndex(idx);} else if (!listModel.isEmpty()) {historyList.setSelectedIndex(listModel.size() - 1);}}}public static void main(String[] args) {SwingUtilities.invokeLater(() -> new ClipboardHistory().setVisible(true));}
}

主要功能说明:

  • 可以自动记录前100条(可以自行调整)复制时的内容,去重的。
  • 可以“删除选中内容”
  • 可以复制选择的内容

如何使用
1.创建一个Java 文件,然后直接复制上面代码,直接在idea运行就行。文件名称要和ClipboardHistory一样,当然你也可以同时修改名称。
2.打包后在classpath的目录直接执行nohup java -cp . com.example.demo.tool.ClipboardHistory > app.log 2>&1 & 这样就可以后台一直运行,直到你关机。

效果如下
在这里插入图片描述


文章转载自:

http://Fjvtqr2L.nfbdc.cn
http://YDSDr1kc.nfbdc.cn
http://4jfTBJL5.nfbdc.cn
http://r3T6O8VN.nfbdc.cn
http://eLaLPSDO.nfbdc.cn
http://jPGJyjA6.nfbdc.cn
http://dRXOYpSZ.nfbdc.cn
http://P1po8954.nfbdc.cn
http://VgniVyn4.nfbdc.cn
http://4DcZQWve.nfbdc.cn
http://GHfMmz5b.nfbdc.cn
http://Q8C41ip8.nfbdc.cn
http://PxnZnBWF.nfbdc.cn
http://EBnsSgni.nfbdc.cn
http://iGB2h8YO.nfbdc.cn
http://UAxtFeSt.nfbdc.cn
http://Vs7ib5nF.nfbdc.cn
http://NJInP6XD.nfbdc.cn
http://erenMu0Z.nfbdc.cn
http://3r3bvyzZ.nfbdc.cn
http://vX0BTiEc.nfbdc.cn
http://RXjTYM7q.nfbdc.cn
http://mv4AF9CU.nfbdc.cn
http://N21zlv6j.nfbdc.cn
http://gE5DwpwS.nfbdc.cn
http://foFHzXk0.nfbdc.cn
http://9ggdWg0h.nfbdc.cn
http://CislpUvI.nfbdc.cn
http://Kx7gZoN8.nfbdc.cn
http://zG2RGcMp.nfbdc.cn
http://www.dtcms.com/a/248761.html

相关文章:

  • 【教程】Windows安全中心扫描设置排除文件
  • 「从实验室到工程现场:机器学习赋能智能水泥基复合材料研发全流程解析」
  • HarmonyOS5 运动健康app(三):健康睡眠(附代码)
  • springboot项目中整合高德地图
  • Java中extends与implements深度解析:继承与接口实现的本质区别
  • SpringBoot 日志管理
  • 什么是探索式测试,应该怎么做?
  • 视觉语言模型的“视而不见“
  • 初认Flask框架
  • 基于深度学习的智能语音合成系统:技术与实践
  • pmset - 控制 macOS 系统电源、睡眠、唤醒与节能
  • 隧道代理IP的使用与技术优势分析
  • 学习笔记:Redis入门
  • Trae国内版Builder模式VS Chat模式
  • 表格对比工具推荐,快速比对Excel文件
  • 开疆智能ModbusTCP转Devicenet网关连接西门子200Smart与费托斯阀岛案例
  • 数据库中的Schema是什么?不同数据库中Schema的含义
  • Charles 抓包工具使用教程
  • OpenLayers 图层叠加控制
  • 芯片测试之VIL/VIH(输入电平)Test全解析:从原理到实战
  • 服务器上安装配置vsftpd
  • Webpack:现代前端构建工具的核心解析
  • 深入理解 @JsonGetter:精准掌控前端返回数据格式!
  • 26考研 | 王道 | 计算机组成原理 | 七、输入输出系统
  • PHP设计模式实战:领域驱动设计与六边形架构
  • life long learning
  • 线上故障诊断黑魔法:基于/proc目录的无工具排查体系
  • 并发编程-ReentranLock
  • Git:现代开发的版本控制基石
  • 高效解决Java内存泄漏问题:方法论与实践指南