Wiki source for WIKomponentenHinzufuegen


Show raw source

======Hinzufügen von Diagramm-Komponenten======

====Kanten-Andockstellen in Knoten definieren====

In der Klasse ""DiagramNode"" befindet sich folgende Methode, welche für die Definition von Kanten-Andockpunkten benutzt wird. Sollte in von ""DiagramNode"" erbenden Klassen die Methode nicht überschrieben werden, wird standardmäßig die folgende verwendet:

%%(java)
protected void updateEgdeConnectors() {
if (edgeConnectors == null) {
int pointCount = 4;
edgeConnectors = new Point[pointCount];
edgeConnectorOffsets = new Point[pointCount];

for (int i = 0; i < pointCount; i++) {
edgeConnectors[i] = new Point();
edgeConnectorOffsets[i] = new Point();
}
}

edgeConnectors[0].move(getWidth() / 2, getHeight()); // South
edgeConnectorOffsets[0].move(0, -(edgeConnectorSize / 2));
edgeConnectors[1].move(getWidth() / 2, 0); // North
edgeConnectorOffsets[1].move(0, edgeConnectorSize / 2);
edgeConnectors[2].move(0, getHeight() / 2); // West
edgeConnectorOffsets[2].move(edgeConnectorSize / 2, 0);
edgeConnectors[3].move(getWidth(), getHeight() / 2); // East
edgeConnectorOffsets[3].move(-(edgeConnectorSize / 2), 0);
}
%%
Dieser Code erzeugt jeweils eine Andockstelle in der Mitte aller vier Knoten-Seiten.

===Zur Funktionsweise:===
Die für die Andock-Punkte notwendigen Attribute sind die Arrays ""edgeConnectors"" und ""edgeConnectorOffsets"". Die Methode überprüft zunächst, ob die Arrays bereits initialisiert sind, was beim ersten Aufruf nicht der Fall ist. Es wird dann der then-Zweig der if-Bedingung betreten und die Arrays mit der entsprechenden Anzahl von Andock-Punkten initialisiert.

Der zweite Block ist für die Berechnung der Punkte zuständig und wird bei jeder Größenänderung einer Komponente aufgerufen. Die Berechnung der Koordinaten muss bei Komponenten die in ihrer Größe variabel sind unbedingt Bezug auf die Größe der Komponente nehmen, also über die Methoden ""getWidth()"" bzw. ""getHeight()"". Eine Verwendung von fixen Größen würde bei Größenveränderungen zu keinerlei Veränderungen in den Koordinaten der Andockpunkten führen! Entscheidend ist außerdem, dass die einmal angelegten Point-Objekte in den Arrays beibehalten werden und nicht durch neue Objekte ersetzt werden. Demnach ist für eine Zuweisung von neuen Koordinaten die Methode ""Point#move(int x, int y)"" zu benutzen und nicht etwa eine Modifikation mittels '= new Point(x, y)'.

Das **Array ""edgeConnectors""** enthält die Koordinaten der Andockstellen, an denen später die Kanten andocken. Zu beachten ist hier, dass das Koordinaten-System bei (0, 0) beginnt und somit die äußeren Kanten einer Komponente bei ""getWidth() - 1"" bzw. ""getHeight() - 1"" liegen. Weiterhin befindet sich der Ursprung des Java-Koordinatensystems "oben-links", höhere y-Werte sind also "weiter unten". Der Ursprung des Koordinatensystems ist der linke-obere Punkt des Knotens.

Das **Array ""edgeConnectorOffsets""** bewirkt eine Verschiebung der in der visuellen Darstellung angezeigten "Andockkästchen" gegenüber den in den ""edgeConnectors"" festgelegten Koordinaten. Die Notwendigkeit ergibt sich aus folgenden Gründen: Eine graphische Java-Komponente ist im allgemeinen eine Fläche mit rechteckiger Begrenzung. Gezeichnet werden kann nur innerhalb der Rechteckfläche. Die dargestellten "Andockkästchen" sind allerdings keine Punkte, sondern besitzen eine flächenmäßige Ausdehnung. Würde man sie exakt an den Rand des Knotens setzen, also z.B. exakt oberhalb einer Andockstelle selber, würde nur der innerhalb der Komponente liegende Anteil des Andockkästchens gezeichnet und der außerhalb liegende Teil abgeschnitten. Dies kann einerseits gewünscht sein, andererseits, wenn die Andockkästchen ihre normale Quadratform besitzen sollen aber auch nicht. In letzterem Fall kann man mit relativen Angaben in den ""edgteConnectorOffsets"" die Andockästchen verschieben. Die Variable **""edgeConnectorSize""** enthält dabei die Größe eines Andockkästchens (welches eine Quadratform hat). Das Code-Beispiel von oben sollte die Anwendung klar machen.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki