Java clipboad错误

时间:2018-02-04 20:20:31

标签: java clipboard

有这样一个程序。它必须分析剪贴板中是否存在五位数字。但是当您第一次复制满足条件的文本时,程序运行正常,但如果您在同一窗口中复制第二个文本,则满足条件的程序将不起作用。也就是说,它仅在您定期更改窗口时才有效。

问题是让程序与每个副本一起使用吗?

import java.awt.*;
import java.awt.datatransfer.*;
import java.io.IOException;

public class Main implements FlavorListener {
    private static Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

    public static void main(String[] args) throws InterruptedException {
        clipboard.addFlavorListener(new Main());

        // fall asleep for 100 seconds, otherwise the program will immediately end

        Thread.sleep(100 * 1000);
    }

    @Override
    public void flavorsChanged(FlavorEvent event) {
        try {
            String clipboardContent = (String) clipboard.getData(DataFlavor.stringFlavor);
            handleClipboardContent(clipboardContent);
        } catch (UnsupportedFlavorException | IOException e) {
            // TODO handle error
            e.printStackTrace();
        }
    }

    private void handleClipboardContent(String clipboardContent) {

        // we check that the length of the string is five
       if (clipboardContent != null && clipboardContent.length() == 5)  
         {


      System.out.println(clipboardContent);
      } 
      else {
        System.out.println("condition false");


        }

    }
}
// 12345
// 56789

1 个答案:

答案 0 :(得分:0)

FlavorListener会在"键入"时通知您。 Clipboard中的数据已更改,而不是数据本身已更改。这意味着,如果您将String复制到Clipboard,则可以"可能"会收到通知,但如果您将另一个String复制到Clipboard,则您不会,因为数据类型没有更改。

"普通"解决您遇到的问题的方法是将剪贴板的内容重置为不同的风格。问题是,如果其他程序需要数据会发生什么?你刚刚践踏了它

相反,你可以偷看"在期刊基础上的数据,并检查内容是否已经改变。一个基本的解决方案是使用Thread来维护当前hashCode内容的String,当hashCode更改时,您将获取副本并执行任何操作你想要的操作。

也许像......

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.FlavorEvent;
import java.awt.datatransfer.FlavorListener;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

public class Test {

    public static void main(String[] args) {
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        clipboard.addFlavorListener(new FlavorListener() {
            @Override
            public void flavorsChanged(FlavorEvent e) {
                System.out.println("Flavor has changed");
                Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
                if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)) {
                    try {
                        String text = (String) clipboard.getData(DataFlavor.stringFlavor);
                        textDidChangeTo(text);
                    } catch (UnsupportedFlavorException | IOException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });
        Thread t = new Thread(new Runnable() {
            private Integer currentHashcode;
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ex) {
                    }
                    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
                    Transferable contents = clipboard.getContents(this);
                    if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)) {
                        try {
                            String text = (String) clipboard.getData(DataFlavor.stringFlavor);
                            if (currentHashcode == null) {
                                currentHashcode = text.hashCode();
                            } else if (currentHashcode != text.hashCode()) {
                                currentHashcode = text.hashCode();
                                textDidChangeTo(text);
                            }
                        } catch (UnsupportedFlavorException | IOException ex) {
                            ex.printStackTrace();
                        }
                    } else {
                        currentHashcode = null;
                    }
                }
            }
        });
        t.start();
    }

    public static void textDidChangeTo(String text) {
        System.out.println("Text did change to: " + text);
    }
}

现在,这远非完美。当内容从String之外的其他内容更改为String时,它可能会生成两个事件。在此,根据您的需求,您可能不需要FlavorListener,但我已将其用于演示目的