Wenn der Benutzer eine oder mehrere Annotationen mittels des
AnnotationTool selektiert, zeichnet die jadice document platform einen
Rahmen um die Bounding Box der Selektion. Die
Darstellung dieses Rahmens ist über das Interface
AnnotationSelectionRenderer
vollständig austauschbar. Integratoren können so das visuelle Erscheinungsbild der
Annotationsselektion an die Anforderungen der eigenen Anwendung
anpassen.
Standardimplementierung DefaultAnnotationSelectionRenderer
Die Klasse
DefaultAnnotationSelectionRenderer
ist die vorkonfigurierte Implementierung des
AnnotationSelectionRenderer. Sie zeichnet
einen gestrichelten Rahmen um die Bounding Box der
Selektion. Die Darstellung ist zweischichtig:
-
Zunächst wird ein halb-transparenter weißer Rahmen gezeichnet (Kontrast-Unterlage).
-
Darüber wird ein halb-transparenter schwarzer, gestrichelter Rahmen (4 px an, 4 px aus) gezeichnet.
Die Koordinaten werden vor dem Zeichnen auf ganzzahlige Pixelwerte gerundet. Damit wird der Rahmen
an das Pixelraster ausgerichtet, um unschärfere Kanten und Flackern bei der
Skalierung zu vermeiden. getSelectionOffset() liefert
(0, 0), da der Rahmen vollständig innerhalb
der Selektions-Bounding-Box gezeichnet wird. Die Klasse eignet sich
als Basisklasse für eigene Implementierungen.
Registrierung am AnnotationTool
Der Renderer wird nach der Registrierung des AnnotationTool am
ToolManager gesetzt:
@CallOnEDT private void configureToolManager(ToolManager tm) { // AnnotationTool registrieren tm.register(AnnotationTool.class, true); // Eigenen Renderer registrieren tm.getTool(AnnotationTool.class).setAnnotationSelectionRenderer(new MyAnnotationSelectionRendererImpl()); }
Beispielimplementierung eines AnnotationSelectionRenderer
Für eine eigene Implementierung stehen zwei Varianten zur Verfügung.
Geeignet, wenn die Standarddarstellung vollständig ersetzt werden soll.
private static class MyAnnotationSelectionRendererImpl implements AnnotationSelectionRenderer {
@Override
public void render(Rectangle2D bounds, List<Annotation> selection, RenderParameters parameters) {
Graphics2D g2 = parameters.getGraphics();
Rectangle2D screen = AffineTransforms.createTransformedBounds2D(parameters.getTransform(), bounds);
Stroke previousStroke = g2.getStroke();
Color previousColor = g2.getColor();
try {
g2.setColor(new Color(0, 108, 255, 128));
g2.setStroke(new BasicStroke(5));
g2.draw(screen);
} finally {
g2.setStroke(previousStroke);
g2.setColor(previousColor);
}
}
@Override
public Point2D getSelectionOffset() {
return new Point2D.Double(0, 0);
}
}Variante B: DefaultAnnotationSelectionRenderer erweitern
Geeignet, wenn die Standarddarstellung beibehalten und
ergänzt werden soll. Die Basisklasse übernimmt das Zeichnen des
Standard-Rahmens; die eigene Implementierung kann davor oder
danach weitere Elemente hinzufügen. Das nachfolgende
Beispiel
MyAnnotationSelectionRenderer
zeigt dieses Vorgehen.
private static class MyAnnotationSelectionRenderer extends DefaultAnnotationSelectionRenderer {
private final Point2D offset = new Point2D.Double(30, 30);
@Override
public void render(Rectangle2D bounds, List<Annotation> selection, RenderParameters parameters) {
// Standard-Marquee zeichnen
super.render(bounds, selection, parameters);
Graphics2D g2 = parameters.getGraphics();
Rectangle2D screen = AffineTransforms.createTransformedBounds2D(parameters.getTransform(), bounds);
// Selektionsrahmen um den Offset vergrößern
screen.setFrame(
screen.getX() - offset.getX() / 2,
screen.getY() - offset.getY() / 2,
screen.getWidth() + offset.getX(),
screen.getHeight() + offset.getY());
Stroke previousStroke = g2.getStroke();
Color previousColor = g2.getColor();
try {
g2.setColor(new Color(0, 108, 255, 128));
g2.setStroke(new BasicStroke(10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2.draw(screen);
} finally {
g2.setStroke(previousStroke);
g2.setColor(previousColor);
}
}
@Override
public Point2D getSelectionOffset() {
return offset;
}
}
