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:

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