Clipboard listener
От: Аноним  
Дата: 13.05.10 13:05
Оценка:
Добрый день.
Есть необходимость знать об изменении содержимого системного буфера обмена.
У класса Сlipboard есть метод добавления объекта типа FlavorListener, который реагирует на изменение типа содержимого в буфере. Но если при изменении содержимого не поменялся его тип, то реакции нет. Хотелось бы узнать, как это можно реализовать без периодического опроса буфера.
Re: Clipboard listener
От: Nicht Россия  
Дата: 13.05.10 14:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.

А>Есть необходимость знать об изменении содержимого системного буфера обмена.
А>У класса Сlipboard есть метод добавления объекта типа FlavorListener, который реагирует на изменение типа содержимого в буфере. Но если при изменении содержимого не поменялся его тип, то реакции нет. Хотелось бы узнать, как это можно реализовать без периодического опроса буфера.

Можно решить постоянной одменой оунера своим
как то так
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.Transferable;

public class RunTest {

    public static class Owner implements ClipboardOwner {

        @Override
        public void lostOwnership(Clipboard clipboard, Transferable contents) {
            System.out.println("Changed");
            Transferable newContents = clipboard.getContents(this);
            clipboard.setContents(newContents, this);
        }

    }

    public static void main(String[] args) throws InterruptedException {
        Owner owner = new Owner();
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable contents = clipboard.getContents(owner);
        clipboard.setContents(contents, owner);
        Thread.sleep(30000);
    }
}


Надо запустить и понажимать контрол-С где нибудь.
Re[2]: Clipboard listener
От: Аноним  
Дата: 13.05.10 15:03
Оценка:
Спасибо, работает, но время от времени сыпятся ошибки:

13.05.2010 18:58:14 clipboardtest.RunTest$Owner lostOwnership
SEVERE: null
java.lang.IllegalStateException: cannot open system clipboard
at sun.awt.windows.WClipboard.openClipboard(Native Method)
at sun.awt.datatransfer.ClipboardTransferable.<init>(ClipboardTransferable.java:61)
at sun.awt.datatransfer.SunClipboard.getContents(SunClipboard.java:130)
at clipboardtest.RunTest$Owner.lostOwnership(RunTest.java:38)
at sun.awt.datatransfer.SunClipboard$2.run(SunClipboard.java:297)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Причем понять, когда предугадать появление ошибки проблематично. С чем это связано?
Re[3]: Clipboard listener
От: Nicht Россия  
Дата: 14.05.10 07:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо, работает, но время от времени сыпятся ошибки:


А>13.05.2010 18:58:14 clipboardtest.RunTest$Owner lostOwnership

А>SEVERE: null
А>java.lang.IllegalStateException: cannot open system clipboard
А> at sun.awt.windows.WClipboard.openClipboard(Native Method)
А> at sun.awt.datatransfer.ClipboardTransferable.<init>(ClipboardTransferable.java:61)
А> at sun.awt.datatransfer.SunClipboard.getContents(SunClipboard.java:130)
А> at clipboardtest.RunTest$Owner.lostOwnership(RunTest.java:38)
А> at sun.awt.datatransfer.SunClipboard$2.run(SunClipboard.java:297)
А> at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
А> at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
А> at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
А> at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
А> at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
А> at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
А> at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
А> at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

А>Причем понять, когда предугадать появление ошибки проблематично. С чем это связано?


Ну в джавадоке по методу getContents() этот эксепшен описан, так что это бай дезайн. Судя по дискуссиям в интернетах это проблемы только windows. У меня под linux такого не наблюдается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.