2

クリップボードの内容をテキストボックスにコピーしようとしていますが、「無効なスレッドアクセス」メッセージが表示されます。

クリップボードのリスナーを使用して、変更がある場合に通知してくれました。

リスナーをラップするために新しいスレッドを作成しましたが、正しく機能していないようです。

コードは次のとおりです。

    public class ClipboardDialog extends TitleAreaDialog {

    // Local attributs
    private Text mTextClipboardcontent;


    public ClipboardDialog (Shell parentShell) {

        super(parentShell);

    }


    @Override
    protected Control createDialogArea(Composite parent) {

        // Creating display and controls

        setTitle("ClipBoard content");
        Composite area = (Composite) super.createDialogArea(parent);
        Composite container = new Composite(area, SWT.NONE);
        container.setLayout(new FormLayout());
        GridData gd_container = new GridData(GridData.FILL_HORIZONTAL);
        // gd_container.grabExcessVerticalSpace = true;
        gd_container.horizontalAlignment = SWT.LEFT;
        gd_container.verticalAlignment = SWT.TOP;
        container.setLayoutData(gd_container);

        // Group control
        Group grpInputData = new Group(container, SWT.NONE);
        FormData fd_grpInputData = new FormData();
        fd_grpInputData.bottom = new FormAttachment(0, 303);
        fd_grpInputData.right = new FormAttachment(0, 467);
        fd_grpInputData.top = new FormAttachment(0, 5);
        fd_grpInputData.left = new FormAttachment(0, 5);
        grpInputData.setLayoutData(fd_grpInputData);
        grpInputData.setText("Input Data");
        GridLayout gl_grpInputData = new GridLayout(4, false);
        gl_grpInputData.marginLeft = 4;
        gl_grpInputData.marginHeight = 0;
        gl_grpInputData.marginWidth = 2;
        gl_grpInputData.verticalSpacing = 10;
        gl_grpInputData.horizontalSpacing = 10;
        grpInputData.setLayout(gl_grpInputData);
        new Label(grpInputData, SWT.NONE);
        new Label(grpInputData, SWT.NONE);
        new Label(grpInputData, SWT.NONE);
        new Label(grpInputData, SWT.NONE);
        new Label(grpInputData, SWT.NONE);


        // Input control
        mTextClipboardcontent = new Text(grpInputData, SWT.BORDER);
        GridData gdContent = new GridData(SWT.LEFT, SWT.TOP, false, false, 1,
                1);
        gdContent.heightHint = 18;
        gdContent.widthHint = 250;
        mTextClipboardcontent.setLayoutData(gdContent);
        mTextClipboardcontent.setBounds(0, 0, 76, 21);
        mTextClipboardcontent.setTextLimit(8);



        new Thread(new Runnable() {
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {
                    }
                    Display.getDefault().syncExec(new Runnable() {
                        public void run() {

                            Toolkit.getDefaultToolkit().getSystemClipboard()
                                    .addFlavorListener(new FlavorListener() {

                                        @Override
                                        public void flavorsChanged(FlavorEvent e) {

                                            String result = "";
                                            Clipboard clipboard = Toolkit
                                                    .getDefaultToolkit()
                                                    .getSystemClipboard();

                                            Transferable contents = clipboard
                                                    .getContents(null);
                                            boolean hasTransferableText = (contents != null)
                                                    && contents
                                                            .isDataFlavorSupported(DataFlavor.stringFlavor);

                                            if (hasTransferableText) {

                                                try {

                                                    // Getting the content of
                                                    // the ClipBoard
                                                    result = (String) contents
                                                            .getTransferData(DataFlavor.stringFlavor);

                                                    mTextContent.settext(result);
                                                } catch (UnsupportedFlavorException ex) {

                                                    // Loggin the exception
                                                    Log.LogError(
                                                            ex.getClass()
                                                                    .getCanonicalName(),
                                                            ex.getMessage());

                                                } catch (IOException ex) {


                                                    // Loggin the exception
                                                    Log.LogError(
                                                            ex.getClass()
                                                                    .getCanonicalName(),
                                                            ex.getMessage());
                                                }

                                            }
                                        }
                                    });

                        }
                    });
                }
            }
        }).start();

        return area;
    }

    /**
     * Create contents of the button bar.
     * 
     * @param parent
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        Button mBtnOK = createButton(parent, IDialogConstants.OK_ID,
                IDialogConstants.OK_LABEL, true);
        mBtnOK.setEnabled(false);
        createButton(parent, IDialogConstants.CANCEL_ID,
                IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * Return the initial size of the dialog.
     */
    @Override
    protected Point getInitialSize() {
        return new Point(479, 400);
    }
}
4

1 に答える 1

4

フレーバーリスナーは、UIスレッドではないスレッドで呼び出されます。

(または、必要に応じて)メソッドを使用して、Runnableに渡すコードを実行する必要があります。DisplayasyncExecsyncExec

Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(
    new FlavorListener() {

    @Override
     public void flavorsChanged(FlavorEvent e) {
         Display.getDefault().asyncExec(new Runnable(){
            public void run(){
              // do things on the UI thread
              String result = "";
              Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
              Transferable contents = clipboard.getContents(null);
              ...
            }
         }
     });

ランナブルはUIスレッドで実行されるため、エラーを回避できます。

UIスレッドでこれを実行する必要はおそらくないことに注意してください。

 Toolkit.getDefaultToolkit().getSystemClipboard()
                                    .addFlavorListener(
于 2012-10-07T15:57:54.490 に答える