0

プログラムでシステムクリップボードを確実に設定するために、1か月間試みてきました。現在、約 95/100 回動作します。しかし、私は探し続けます。

昨日、私はこのJava DefaultEditorKit.copyActionに出会い、私が望むことを実行する可能性のある何かが既に書かれているのを見て、少し死んでしまいました。

問題は、これがダイアログの「アクション」であることですが?

クリップボードにコピーしたいテキストを発行するにはどうすればよいですか? この「アクション」をアプリのボタン/コンポーネントにアタッチしたくありません。できるようになりたい

DefaultEditorKit.copyAction("Put this on Clipboard");

しかし、これは未定義です。この「アクション」をトリガーして、操作するテキストを与える方法がわかりませんか?

編集:例外を引き起こす私のコードは次のとおりです。

public void setClip2(String arg)
{
    while(true) 
    {
        try
        {
            sysClip.setContents(new StringSelection(arg), null);
        }
        catch(Exception e)
        {
            try {Thread.sleep(20);} catch (InterruptedException e1) {}
            continue;
        }
        break;
    }
    return;
}
4

2 に答える 2

1

クリップボードを確実に設定する方法があるかどうか疑問に思いました。(このメソッドは、設定を試みるのに十分な時間待機しないと失敗します。これは通常、約 1 ~ 2 秒です。

クリップボードの内容を設定するのを待たなければならない理由がわかりません。

このプログラムでは、200 ミリ秒ごとにクリップボードを更新しても問題はありません。つまり、期待どおりに表示されるたびに、数値が 1 ずつ増加します。

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

class ClipboardLoopTest
{
    public static void main(String[] args)
        throws InterruptedException
    {
        for (int i = 0; i < 100; i++)
        {
            //  add data to clipboard

            try
            {
                Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
                StringSelection testData;
                testData = new StringSelection( "Test: " + i );
                c.setContents(testData, testData);

                //  Get clipboard contents, as a String

                Transferable t = c.getContents( null );

                if ( t.isDataFlavorSupported(DataFlavor.stringFlavor) )
                {
                    Object o = t.getTransferData( DataFlavor.stringFlavor );
                    String data = (String)t.getTransferData( DataFlavor.stringFlavor );
                    System.out.println( "Clipboard contents: " + data );
                }
            }
            catch(Exception e)
            {
                System.out.println(e);
            }

            Thread.sleep(200);
        }

        System.exit(0);
    }
}

Windows 7 で JDK 7 を使用しています。

おそらく、問題を示す SSCCE を投稿できます。

于 2013-02-06T16:45:34.607 に答える
0

DefaultEditorKit.copyActionjava.awt.datatransfer の機能を実際に (いくつかのレイヤーを介して) 使用します。そこには、データをクリップボードに送信するためのクラスがあります。

基本的に、Swing コンポーネントを使用せずに文字列をクリップボードに送信するだけの場合は、 をセットアップしClipboardOwner、オブジェクトを作成しStringSelectionて、システムのクリップボードに渡します。最も基本的な例を次に示します。

Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents( new StringSelection("Put this on Clipboard"), new ClipboardOwner() {

    @Override
    public void lostOwnership(Clipboard clipboard, Transferable contents) {
      System.out.println("I am no longer the clipboard owner.");
    }
} );
于 2013-02-06T15:00:15.363 に答える