SWT Tracker не показывает прямоугольник в ОС Ma c при подключенном внешнем мониторе? - PullRequest
0 голосов
/ 26 мая 2020

Я пытался захватить регион через трекер SWT, используя перетаскивание мышью, выполненное пользователем. Он отлично работает, когда я нахожусь на экране ноутбука, но я не вижу прямоугольника, нарисованного перетаскиванием мыши на экране ноутбука, когда внешний монитор подключен к моей ма c. Ниже приведен код того же.

package test.screen.capture;
import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tracker;



public class ScreenCapture {
  public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setSize(300, 200);
    shell.setText("Screen Capture");
    shell.setLayout(new RowLayout());

    final Button button = new Button(shell, SWT.PUSH);
    button.setText("Capture");


    button.addSelectionListener(new SelectionListener() {

      public void widgetSelected(SelectionEvent event) {

                 new RegionSelector(new Observer() {

                    @Override
                    public void update(Observable o, Object arg) {
                        System.out.println(o+""+arg);
                    }
                });

            }


      public void widgetDefaultSelected(SelectionEvent event) {
      }
    });
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }
  /**
     * class that allows user to select screen region to capture
     */
    static class RegionSelector implements Runnable {
        Shell shell;
        Observer listener;
        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

        public RegionSelector(Observer listener) {
            System.out.println("RegionSelector()");
            this.listener = listener;
            open();
        }

        void dispose() {
            System.out.println("RegionSelector.dispose()");

            if (scheduler != null) {
                scheduler.shutdown();
                scheduler = null;
            }

            if (shell != null) {
                shell.dispose();
                shell = null;
            }
        }

        void open() {
            System.out.println("RegionSelector.open()");

            shell = new Shell(Display.getDefault(), SWT.NO_TRIM | SWT.ON_TOP);
            shell.setSize(5, 5);
            shell.addMouseMoveListener(
                new MouseMoveListener() {
                    public void mouseMove(MouseEvent arg0) {
                        Point p = Display.getDefault().getCursorLocation();
                        shell.setLocation(p.x-2, p.y-2);
                    }
                });

            shell.addMouseListener(
                new MouseAdapter() {
                    public void mouseDown(MouseEvent event) {
                        if (event.button == 1) {
                            dragRegion(Display.getDefault().getCursorLocation());
                        }
                    }});

            Point p = Display.getDefault().getCursorLocation();

            shell.setCursor(Display.getDefault().getSystemCursor(SWT.CURSOR_CROSS));
            shell.setLocation(p.x-2, p.y-2);
            shell.open();
            //shell.forceActive();

            // start cursor position tracker
            scheduler.execute(this);
        }

        void dragRegion(Point p) {
            System.out.println("RegionSelector.dragRegion(): start " + p);

            Tracker tracker = new Tracker(Display.getDefault(), SWT.RESIZE);

            tracker.setStippled(true);
            Rectangle rectangle = new Rectangle(p.x, p.y, 1, 1);
            tracker.setRectangles(new Rectangle[] { rectangle });
            tracker.open(); // this is a synchronous call

            listener.update(null, tracker.getRectangles()[0]);

            tracker.dispose();
            dispose();
        }

        @Override
        public void run() {
            Display.getDefault().syncExec(
                new Runnable() {
                    @Override
                    public void run() {
                        if (shell == null || shell.isDisposed()) {
                            dispose();
                        } else {
                            Point p = Display.getDefault().getCursorLocation();

                            if (! shell.getBounds().contains(p)) {
                                shell.setLocation(p.x-2, p.y-2);
                            }

                            // reschedule cursor position tracker
                            scheduler.schedule(RegionSelector.this, 250L, TimeUnit.MILLISECONDS);
                        }
                    }
                });
        }
    }
}

Любая подсказка по этому поводу будет полезна

...