Hej!
Piszę program służący do przechwytywania i edycji schowka systemowego.

  1. Zauważyłem, że program działa poprawnie, jeśli uśpię wątek (chociażby na jedną milisekundę). Miejsce "snu" zaznaczyłem w kodzie Caps Lockiem.
  2. Jeśli tego nie robię, to program przechwytuje schowek, tylko jeśli kopiuję jakiś kod z mojego IDE Eclipse (nie z zewnętrznych aplikacji), do tego nie można wklejać zawartości schowka, a komputer głośno działa.

Zdaję sobie sprawę, że while(true) nie jest najlepszym rozwiązaniem (wersja robocza), w późniejszej wersji napiszę jakoś while(hasToRun), żeby to kontrolować.

Co może powodować to dziwne zachowanie programu?
Z góry dzięki!

import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

public class ClipboardLinkShortener extends Thread implements ClipboardOwner, Runnable {

	public static Clipboard myClipboard = null;
	public static String previous = null;
	public static String clipboardString = null;
	public static int i = 0;

	public void run() {
		while (true) {
			
			myClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
			boolean success = false;
			/*
			 * ONLY WITH THE NEXT TRY-CATCH BLOCK THE PROGRAM WORKS.
			 */
			try {
				Thread.sleep(1);
			} catch (Exception e1) {
				e1.printStackTrace();
			}
			try {
				/*
				 * Throws an UnsupportedFlavorException, if plaintext cannot be
				 * derived from the clipboard.
				 */
				clipboardString = (String) myClipboard.getData(DataFlavor.stringFlavor);
				/*
				 * Variable success is true when no exception is thrown one line above.
				 */
				success = true;
			} catch (UnsupportedFlavorException | IOException e) {
				/*
				 * No plaintext form can be derived from clipboard contents.
				 * Optional:
				 */
				continue;
			} catch (IllegalStateException e) {
				previous = null;
			} finally {
				if (success) {
					/*
					 * If contents of clipboard have been updated:
					 */
					if (previous == null || !clipboardString.equals(previous)) {
						System.out.println((++i) + ". update of clipboard:");
						System.out.println(clipboardString);
						previous = clipboardString;
					}

				}
			}
		}
	}

	@Override
	public void lostOwnership(Clipboard c, Transferable t) {
		System.out.println("Lost!");
	}

	public static void main(String[] args) throws IOException, HeadlessException, UnsupportedFlavorException {

		new Thread(new ClipboardLinkShortener()).start();
	}

}

"My code works but I don't know why..."