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

发布于:2025-06-16 ⋅ 阅读:(23) ⋅ 点赞:(0)

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


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() {
            @Override
            public 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 & 这样就可以后台一直运行,直到你关机。

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