java - 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 没有被应用程序的主外壳调用。
有没有其他方法可以在应用程序的现有布局上绘制一些东西而不会阻止与下面控件的交互?
解决方案
Eclipse 平台通过创建和绘制一个覆盖外壳来实现这一点,该覆盖外壳被小心地放置在基础外壳之上。覆盖层是用它创建的SWT.NO_TRIM | SWT.ON_TOP
,它的位置跟踪底层的基础壳。有关示例,请参见 e4覆盖。
推荐阅读
- numpy - 如何获得与contourf相对应的数组?
- sql-server - SSIS – 如何使用我的自定义日志提供程序获取自定义日志条目?
- model-binding - 模型绑定Asp net core 2.2
- local-storage - NGXS 和 LocalStorage:如何从本地存储中排除某些数据
- java - 在 mockito 测试用例中使用 @Value 属性
- javascript - 为什么闪亮的默认应用程序会导致 javascript 错误和警告?
- ruby-on-rails - Rails 5:付款成功后重定向到随机页面
- javascript - 未捕获的类型错误:$(...).multiselect 不是函数
- html - 如何从 HTML 输入中读取数据并将该数据本地写入文件以供将来访问
- java - 查询解析器构建 Predicate 以过滤内存中的 bean