在剪贴板内容发生变化时调用方法

use*_*859 7 java clipboard

我正在尝试制作一个应该显示剪贴板内容的小桌面应用程序(如果它是一个字符串).我已经完成了一个构造函数,它运行良好,现在我只想在文本被复制到操作系统中的剪贴板时调用类似的方法.我是新手,所以任何帮助将不胜感激!有些东西告诉我,我应该以某种方式使用中断......

package pasty;

import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class PastyFrame implements KeyListener {

    String currentClipboardString;
    JLabel clipboardLabel = new JLabel();

    public PastyFrame() {
        JFrame frame = new JFrame();
        frame.setVisible(true);

        try {
            currentClipboardString = (String) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
        } catch (UnsupportedFlavorException | IOException ex) {
            Logger.getLogger(PastyFrame.class.getName()).log(Level.SEVERE, null, ex);

            currentClipboardString = "";
        }
        if (currentClipboardString.isEmpty()) {
            currentClipboardString = "The clipboard is empty";
        }
        frame.setSize(400, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLayout(new FlowLayout());


        clipboardLabel.setText(currentClipboardString);
        frame.add(clipboardLabel);
}
Run Code Online (Sandbox Code Playgroud)

dar*_*esm 11

我用这个.全班.

public class ClipBoardListener extends Thread implements ClipboardOwner{
Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard();  


    @Override
  public void run() {
    Transferable trans = sysClip.getContents(this);  
    TakeOwnership(trans);       

  }  

    @Override
  public void lostOwnership(Clipboard c, Transferable t) {  

  try {  
    ClipBoardListener.sleep(250);  //waiting e.g for loading huge elements like word's etc.
  } catch(Exception e) {  
    System.out.println("Exception: " + e);  
  }  
  Transferable contents = sysClip.getContents(this);  
    try {
        process_clipboard(contents, c);
    } catch (Exception ex) {
        Logger.getLogger(ClipBoardListener.class.getName()).log(Level.SEVERE, null, ex);
    }
  TakeOwnership(contents);


}  

  void TakeOwnership(Transferable t) {  
    sysClip.setContents(t, this);  
  }  

public void process_clipboard(Transferable t, Clipboard c) { //your implementation
    String tempText;
    Transferable trans = t;

    try {
        if (trans != null?trans.isDataFlavorSupported(DataFlavor.stringFlavor):false) {
            tempText = (String) trans.getTransferData(DataFlavor.stringFlavor);
            System.out.println(tempText);  
        }

    } catch (Exception e) {
    }
}

}
Run Code Online (Sandbox Code Playgroud)

当其他程序获得剪贴板的所有权时,它会等待250毫秒,并通过更新的内容收回剪贴板的所有权.


Rei*_*eus 9

您可以调用Clipboard.addFlavorListener来侦听来自操作系统的剪贴板更新:

Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(new FlavorListener() { 
   @Override 
   public void flavorsChanged(FlavorEvent e) {

      System.out.println("ClipBoard UPDATED: " + e.getSource() + " " + e.toString());
   } 
}); 
Run Code Online (Sandbox Code Playgroud)

一些备注:

  • 要启动应用程序,请考虑使用初始线程.
  • 调用JFrame.pack以设置帧大小.
  • 键绑定优先于Swing中的KeyListeners映射KeyEvents.

  • 我不确定这对我是否真的有用:从我的实验中可以看出,当(例如)我首先选择并复制一些文本时,监听器会响应......但如果我再复制一些文本,则监听器不会触发.这并不奇怪,因为看起来你正在等待FLAVOR改变.可能解决方案可能是在每次事件后清空剪贴板? (3认同)
  • @mikerodent-只要您使用其他应用程序从剪贴板复制,就会触发该事件。只要您使用同一个应用程序,该事件就只会触发一次。 (2认同)