Я пытался «переопределить» главное окно моего приложения 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 не вызывается основной оболочкой приложения.
Есть ли другой способ нарисовать что-либо на существующем макете приложения, не блокируя взаимодействие с элементами управления ниже?