2014-09-06 67 views
1

我使用StringSelection和clipbaord方法粘貼字符串。將剪貼板的所有權設置爲StringSelection後,CTRL + C不復制到剪貼板

StringSelection selection = new StringSelection("myString"); 

    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
    clipboard.setContents(selection, selection); 

這給了剪貼板選擇的所有權。然後我使用機器人粘貼可以工作的內容,但稍後當我使用機器人嘗試在屏幕上覆制選定文本時,通過模擬CTRL + C,它似乎失敗了。然後,我將一個字符串設置爲剪貼板的內容,並獲得「mystring」。

//Control+c 
robot.keyPress(KeyEvent.VK_CONTROL); 
robot.keyType(KeyEvent.VK_C); 
robot.keyRelease(KeyEvent.VK_CONTROL); 

robot.delay(3000); 

//save clipboard into string 
String newString = ""; 
    try { 
     newString = (String) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor); 
    } catch (HeadlessException e) { 
     e.printStackTrace(); 
    } catch (UnsupportedFlavorException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

System.err.println(newString);//prints "myString" 

我認爲這可以通過在該剪貼板的所有權被給選擇類剪貼板的setContents方法的第二個參數引起。我不知道如何重置剪貼板的所有權。 Java文檔指出,當另一個應用程序或此應用程序中的另一個對象聲明剪貼板的所有權時,將調用lostOwnership方法「,所以我不認爲這是因爲它不會釋放所有權。

手動使用ctrl + c也無法複製到剪貼板。

回答

1

首先,我認爲在設置剪貼板數據和讓數據可用於其他應用程序之間存在延遲。實際上,有一個小小的延遲,並且在獲取內容幫助我之前設置Thread.sleep ...但不是所有情況。它從那以後隨機地工作。

然後,我編寫了一個應用程序來連續執行剪貼板的system.out.println()(看起來像java程序),但不管我做了多少次CTRL + C,它只顯示舊值(程序啓動時的值)。但我確定系統得到了我的CTRL + C,因爲同時java說只有舊數據,windows剪貼板查看器,CTRL + V顯示剛纔複製的數據。所以,似乎只有java無法獲得更新。

然後,我將代碼移到用戶界面線程之外的另一個線程,問題似乎已停止。我認爲有些東西一直在接收剪貼板中的更改,但是隨着用戶界面線程繁忙(即使是睡眠),也不會收到這些更改。

因此,嘗試將您的代碼放入另一個從主線程啓動的線程中。