# Linie mit Rand zeichnen



## newnoise (3. Dez 2009)

Hallo,

hat Java eine Methode um eine Linie mit Rand zu zeichnen?
Wenn ja, wo?
Gibt es sonst eine gute OpenSource Graphik Lib die sowas kann?
Google hat mir nicht geholfen ..

Danke!
noise


----------



## Marco13 (3. Dez 2009)

Ein möglicher Workaround wäre eine Linie mit Dicke 3, und darüber eine mit Dicke 1...


----------



## newnoise (3. Dez 2009)

ja so mache ich es immoment. aber es sieht nicht immer schoen aus.
dachte da haette jemand schonmal was gemacht evtl. der es etwas besser kann als ich 

danke trotzdem schonmal


----------



## newnoise (5. Dez 2009)

nicht jemand noch nen tipp für ne lib die das kann?
google hilft mir leider nicht.

danke!


----------



## javimka (5. Dez 2009)

Vielleicht sieht es Anti-Aliased besser aus. Setze Mal folgenden Befehl vorne dran:

```
Graphics2D g2 = (Graphics2D)g;
   g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
```
Und dann auf g2 zeichnen.


----------



## Spacerat (5. Dez 2009)

Ich glaub' ne Lib wirst du dafür kaum finden, weil Graphics2D (also sprich die Java2D-API) das alles schon mitbringt. Dem JDK liegt ein Java2D-Demo inklusive Quelltext bei. Mit Sicherheit findet sich dort auch ein Ansatz dazu, wie auch deine Linien irgendwann besser aussehen. Einfach mal ansehen und mit den interessanten Stellen im Quelltext ein bissl experimentieren.


----------



## newnoise (6. Dez 2009)

also ich mache das immoment so:


```
private void drawLineWithBorder(int x1, int y1, int x2, int y2, 
			int size, int borderSize, Color innerColor, Color borderColor, Graphics2D g) {			
        
		Graphics2D temp = g;
		
		Stroke stroke = new BasicStroke(size, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND);
        g.setStroke(stroke);
		g.setColor(borderColor);
		
		g.drawLine(x1, y1, x2, y2);
		
		Stroke stroke2 = new BasicStroke(size - (borderSize * 2), BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND);
        g.setStroke(stroke2);
		g.setColor(innerColor);
        
		g.drawLine((x1 - borderSize), (y1 - borderSize), (x2 + borderSize), (y2 + borderSize));
		
		g = temp;
	}
```

aber das sieht echt nicht schön aus.
hat da jemand noch ne idee zu?

vielen dank!


----------



## Spacerat (6. Dez 2009)

Ja... ich hätte da eine...
Ich hab' deine Methode jetzt nicht durchgetestet, aber ich nehme mal an, dass sie mit horizontalen und vertikalen Linien funktioniert. Für alle naneder Linien passen nämlich Start- und Endpunkt der Inneren nicht mehr, weil diese immer noch um einen 90° Vektor verschoben werden, weil [c]bordersize[/c] direkt verwendet wird. [c]bordersize[/c] müsste nämlich für beide Koordinaten im Verhältnis der Liniensteigung neu berechnet werden. Aber möglicherweise zeichnet er die innere Linie auch korrekt, wenn man es ganz weglässt.


----------



## newnoise (6. Dez 2009)

wie ist das denn in java, ist die startkoordinate die man angibt der obere punkt der linie dann?
also bei x1 = 3 und y1 = 3 und einer liniendicke von 4. geht dann die "linien-breiten-gerade" von 3,3 nach 3,7 bei einer horizontalen?
und bei linien mit winkel dann jeweils irgendwie in dem winkel verschoben?

danke


----------



## Spacerat (6. Dez 2009)

Also wenn man die Bordersize weglässt, bekommt die Linie rechts und links egal in welcher Lage einen gleichmässigen Rand. Wenn man also am Beginn und am Ende auch noch Ränder haben will, wird man wohl um die Berechnung der Start- und Endpunkte der inneren Linie nicht drum herum kommen. Jedoch genügt es nicht, schlicht die Bordersize zu addieren bzw. zu subtrahieren.


----------



## newnoise (6. Dez 2009)

ah. perfekt. ich dachte halt nicht, dass der den punkt mittelt quasi ..., sondern das die eck-koordinaten der linie angegeben werden!

danke


----------

