首页 > 解决方案 > Overdraw Eclipse RCP 应用程序的主外壳

问题描述

我一直在尝试“透支”我的 Eclipse RCP 应用程序的主窗口,以便在应用程序启用屏幕录制功能时显示红色的“录制”边框。

private boolean isActive;

private final ProgressMonitorDialog monitor;

private PaintListener paintListener;
private final int recordingFrameThickness = 5;  

public boolean toggle() {
  isActive = !isActive;

  try {
    // New state
    if (isActive) {
      monitor.run(true, false, new BackupExecutionBeginRecording(Display.getCurrent()));
      addRecordingFrame(Display.getCurrent().getActiveShell());
    }
    else {
      monitor.run(true, false, new BackupExecutionAfterRecording());
      removeRecoringFrame(Display.getCurrent().getActiveShell());
    }
  }
  catch (InvocationTargetException e) {
    System.err.println("Couldn't start backup task. Error: " + e.getMessage());
  }
  catch (InterruptedException e) {
    System.err.println("Backup thread was interrupted. Error: " + e.getMessage());
  }

  return isActive;
}

private void addRecordingFrame(Shell shell) {
  paintListener = new PaintListener() {

    @Override
    public void paintControl(PaintEvent e) {
      Rectangle clientArea = shell.getClientArea();
      e.gc.setLineWidth(recordingFrameThickness);
      e.gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
      e.gc.drawRectangle(clientArea);
    }
  };

  shell.addPaintListener(paintListener);
}

private void removeRecoringFrame(Shell shell) {
  shell.removePaintListener(paintListener);
}

如您所见,我遵循的方法是等到应用程序主窗口被绘制后,然后添加一个矩形。理论上,每次改变窗口大小或位置后,应该重新渲染覆盖的红框。但似乎 PaintEvent 没有被应用程序的主外壳调用。

有没有其他方法可以在应用程序的现有布局上绘制一些东西而不会阻止与下面控件的交互?

标签: javaeclipseeclipse-rcp

解决方案


Eclipse 平台通过创建和绘制一个覆盖外壳来实现这一点,该覆盖外壳被小心地放置在基础外壳之上。覆盖层是用它创建的SWT.NO_TRIM | SWT.ON_TOP,它的位置跟踪底层的基础壳。有关示例,请参见 e4覆盖。


推荐阅读