wie kann die Dicke einer mit Graphics.drawLine(x1,y1,x1,y2) gezeichneten
Linie verändern?
Die einzige Lösung war für mich ein sehr schmales aber langes Rechteck zu
zeichnen und dieses zu füllen.
Gibt es keine andere Möglichkeit?
Viele Grüße,
Tobias :-)
Tobias Stening wrote:
> wie kann die Dicke einer mit Graphics.drawLine(x1,y1,x1,y2) gezeichneten
> Linie verändern?
> Die einzige Lösung war für mich ein sehr schmales aber langes Rechteck zu
> zeichnen und dieses zu füllen.
> Gibt es keine andere Möglichkeit?
Doch: java.awt.BasicStroke
Linda ... geht jetzt aber wirklich :)
--
Voy directamente a tí, directamente a tí. Para encontrarte,
yo puedo llegar hasta el fin. Luis G. Escolar/Per Gessle
_.:*~*:._.:*~*:.__.:*~*:..:*~*:._.:*~*:._.:*~*:._.:*~*:._.:*
Ich fürchte nein. Deine Lösung ist doch ok, was spricht dagegen?
Gruss
--
Robert Mahnke
Hompage und FAQ von de.comp.lang.java:
www.dclj.de
Graphics2D
void setStroke(Stroke s)
Sets the Stroke for the Graphics2D context.
Beispiel:
private static BasicStroke thick = new BasicStroke (5f);
public void paint (Graphics g) {
Graphics2D g2d = (Graphics2D)g;
g2d.setStroke (thick);
g2d.draw (new Line2D.Float (10, 10, 100, 100));
}
Gruß,
Jo"nc/nt"sch.
--
Fürchte dich nicht vor langsamen Veränderungen, fürchte dich vor
dem Stillstand!
Danke für dir Tipps! Hat geklappt! :-)
Gruss, Tobi
> wie kann die Dicke einer mit Graphics.drawLine(x1,y1,x1,y2) gezeichneten
> Linie verändern?
> Die einzige Lösung war für mich ein sehr schmales aber langes Rechteck zu
> zeichnen und dieses zu füllen.
>
> Gibt es keine andere Möglichkeit?
Schau Dir mal Graphics2D und Stroke bzw. BasicStroke an.
Anwendungsbeispiel:
import java.awt.*;
import java.awt.event.*;
public class StrokeTest extends Frame {
public static void main(String[] args) {
new StrokeTest().setVisible(true);
}
StrokeTest() {
setSize(200, 200);
// closing mechanism
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
// Linienbreite 3
Stroke stroke = new BasicStroke(3f);
g2.setStroke(stroke);
g2.drawLine(30, 30, 170, 170);
}
}
Gruß,
Michael
>Graphics2D
>
> void setStroke(Stroke s)
> Sets the Stroke for the Graphics2D context.
Bezeichnet man dann die Liniendicke als "stroke unit"?
[...]
Gruß,
Marco, Clown verspeisend
--
Bitte nur in der Newsgroup antworten, nicht per Email!
de.comp.lang.java Homepage: http://www.dclj.de/
FAQ: http://www.faqs.org/faqs/de/comp-lang-java/faq/
Meine Java-Seiten: http://www.geocities.com/marcoschmidt.geo/java.html
> Aljoscha Rittner wrote:
>
>> Graphics2D
>>
>> void setStroke(Stroke s)
>> Sets the Stroke for the Graphics2D context.
>
> Bezeichnet man dann die Liniendicke als "stroke unit"?
Oh nein, mich trifft der Schlag ;)
> [...]
>
> Gruß,
> Marco, Clown verspeisend
Er zappelt noch...
Gruß,
Josch.
--
DAUs zu beweisen, daß sie DAU sind wäre Rekursion.
(Werner Jakobi zu Norbert Sima in dag°)
>> Bezeichnet man dann die Liniendicke als "stroke unit"?
>
> Oh nein, mich trifft der Schlag ;)
Irgendwie stelle ich immer wieder gewisse bildungslücken fest. Aber da
ich nun mal lernwillig bin: Kann mir bitte jemand den Witz erklären?
Gruß,
Michael
Stroke unit sind Abteilungen für Schlaganfallpatienten.
Der Rest ergibt sich dann wohl. :-)
Das war ein Kalauer ;-) - Als Stroke Unit bezeichnet ein Analyse und
Behandlungsverfahren von Schlaganfall Patienten. Stroke Units sind
aber auch Behandlungszentren für Schlaganfall-Patienten.
Da Stroke kann nämlich Schlag, Schlaganfall oder auch Federstrich
heißen. Der Federtrich ist wohl hier bei Graphics2D gemeint :)
Gruß,
Josch.
--
Die Lyrics sind, manchmal tief misogynistic und gelegentlich
geichmäßiges heart-warming brash, während Musik absolut singen-entlang
campfirevölkern-tastic ist.
[Vitaminic-Besprechung einer Folkband - zitiert in der c't]
> Stroke unit sind Abteilungen für Schlaganfallpatienten.
> Der Rest ergibt sich dann wohl. :-)
Und da soll man drauf kommen. ;-)
Seid Ihr alle beim Roten Kreuz oder schaut ihr jeden Abend amerikanische
Krankenhausserien? *g*
Leo wollte mir jedenfalls nicht recht weiterhelfen...
Gruß,
Michael
Bewahre mich, nein!
Ich studiere Medizinische Informatik. :-)
>> Seid Ihr alle beim Roten Kreuz oder schaut ihr jeden Abend amerikanische
>> Krankenhausserien? *g*
>
> Bewahre mich, nein!
>
> Ich studiere Medizinische Informatik. :-)
Na, da lag ich ja gar nicht so falsch. *fg*
Michael
Hab's gerade mal bei Google eingegeben, da gibt es viele Treffer, die
sofort in die richtige Richtung lenken.
1:0 für Google
:-)
SCNR
> [...]
>
> public void paint (Graphics g) {
> Graphics2D g2d = (Graphics2D)g;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Wo wir schonmal dabei sind: Wie sicher kann man sich eigentlich sein, dass eine
paint(Graphics) Methode auch eine Instanz von Graphics2D übergeben kriegt?
Zumindest DebugGraphics ist (IIRC) doch von von Graphics und nicht Graphics2D
abgeleitet!
Oder ist das je nach JRE-Version und OS immer mal anders?
Ich hab das bis jetzt immer so gemacht, dass ich ein BufferedImage als buffer
benutzt habe, denn die createGraphics() Methode gibt ja sicher ein Graphics2D
zurück. Dieses BufferedImage hab ich dann in die übergebene Graphics Instanz
gemalt.
> [...]
//Ste*wollt ich schon immer mal wissen*phan
> Aljoscha Rittner schrieb:
>
>> [...]
>>
>> public void paint (Graphics g) {
>> Graphics2D g2d = (Graphics2D)g;
>
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> Wo wir schonmal dabei sind: Wie sicher kann man sich eigentlich sein, dass eine
> paint(Graphics) Methode auch eine Instanz von Graphics2D übergeben kriegt?
Nicht sonderlich, außer man arbeitet mit Swing und
LightWeight-Komponenten. Also der Standard-Fall ;-)
Der politisch korrekte Weg ist eigentlich:
if ( g instanceof Graphics2D ) {
...
}
ist aber typischerweise nicht notwendig. Meistens programmiert man
paint oder paintComponent für eine ganz bestimmte Komponente und kann
dann sicher sein, dass Graphics2D angewendet wird.
> Zumindest DebugGraphics ist (IIRC) doch von von Graphics und nicht Graphics2D
> abgeleitet!
Jepp.
> Oder ist das je nach JRE-Version und OS immer mal anders?
Sogar das könnte sein. Wenn es aber wirklich so wäre, müßte Sun eine
Menge Tutorials umschreiben ;-)
> Ich hab das bis jetzt immer so gemacht, dass ich ein BufferedImage als buffer
> benutzt habe, denn die createGraphics() Methode gibt ja sicher ein Graphics2D
> zurück. Dieses BufferedImage hab ich dann in die übergebene Graphics Instanz
> gemalt.
Das würde ich auch machen, wenn ich HeavyWeight-Komponenten bemale.
Unter Swing nehme ich es (ehrlicherweise) als Sun-Gegeben hin.
DebugGraphics konnte ich übrigens noch nie was abgewinnen. Mit
System.out kam ich immer deutlich weiter...
Gruß,
Josch.
--
> Es gibt *keine* Regel im de-Usenet die die Benutzung des echten Namens
> *verpflichtet*!
Du kannst auch mit 'ner Maske auf dem Kopf in eine Bank gehen, um Geld
von Deinem Konto abzuheben. [Marco aka Rüdiger aka Tim & Jygn in dag°]
Aljoscha Rittner wrote:
> Nicht sonderlich, außer man arbeitet mit Swing und
> LightWeight-Komponenten. Also der Standard-Fall ;-)
>
> Der politisch korrekte Weg ist eigentlich:
>
> if ( g instanceof Graphics2D ) {
> ...
> }
> ist aber typischerweise nicht notwendig. Meistens programmiert man
> paint oder paintComponent für eine ganz bestimmte Komponente und kann
> dann sicher sein, dass Graphics2D angewendet wird.
Ich pruefe nicht extra mit instanceof hier, casten auf 2D ist IME ok.
> Das würde ich auch machen, wenn ich HeavyWeight-Komponenten bemale.
> Unter Swing nehme ich es (ehrlicherweise) als Sun-Gegeben hin.
Swing-painting ist jedenfalls double-buffered by default.
Linda
--
Within it was a darker, indistinct shape, which wavered and . ' .
changed even as they watched.And all the time there was the -= * =-
high, brain-curdling whine of a huge magical field '/. '
Terry Pratchett, The Color Of Magic _____ /
> [...]
> > Wo wir schonmal dabei sind: Wie sicher kann man sich eigentlich sein, dass eine
> > paint(Graphics) Methode auch eine Instanz von Graphics2D übergeben kriegt?
>
> Nicht sonderlich, außer man arbeitet mit Swing und
> LightWeight-Komponenten. Also der Standard-Fall ;-)
In dem Fall habe ich es aber noch nie gebraucht. Jetzt, wo ich eine browserkompatible
2D Engine bastle, brauch ich das AWT (Performance, seit jdk1.0). Da malt man viel
mehr 'by-hand' (Graphics#drawSonstwas(...)) als bei normalen guis. Also macht sowas
wie Antialiasing bei Swing viel weniger Sinn als hier...
>
> Der politisch korrekte Weg ist eigentlich:
>
> if ( g instanceof Graphics2D ) {
> ...
> }
Das ist klar, aber was steht bei 'else'? ;)
if (gfx instanceof Graphics2D) {
// antialiasing setzen, was cooles malen
} else {
System.out.println("Tja, dummerweise kein Graphics2D...");
}
>
> [...]
> > Oder ist das je nach JRE-Version und OS immer mal anders?
>
> Sogar das könnte sein. Wenn es aber wirklich so wäre, müßte Sun eine
> Menge Tutorials umschreiben ;-)
Man weiß ja nie! ;)
>
> > Ich hab das bis jetzt immer so gemacht, dass ich ein BufferedImage als buffer
> > benutzt habe, denn die createGraphics() Methode gibt ja sicher ein Graphics2D
> > zurück. Dieses BufferedImage hab ich dann in die übergebene Graphics Instanz
> > gemalt.
>
> Das würde ich auch machen, wenn ich HeavyWeight-Komponenten bemale.
> Unter Swing nehme ich es (ehrlicherweise) als Sun-Gegeben hin.
Engine2D extends Canvas -> heavyweight. Aber den Buffer brauche ich sowieso, also ist
es _hier_ kein Problem.
>
> DebugGraphics konnte ich übrigens noch nie was abgewinnen. Mit
> System.out kam ich immer deutlich weiter...
ACK.
>
> Gruß,
> Josch.
//Stephan
> Aljoscha Rittner schrieb:
>
>> [...]
>>> Wo wir schonmal dabei sind: Wie sicher kann man sich eigentlich sein, dass eine
>>> paint(Graphics) Methode auch eine Instanz von Graphics2D übergeben kriegt?
>>
>> Nicht sonderlich, außer man arbeitet mit Swing und
>> LightWeight-Komponenten. Also der Standard-Fall ;-)
>
> In dem Fall habe ich es aber noch nie gebraucht. Jetzt, wo ich eine browserkompatible
> 2D Engine bastle, brauch ich das AWT (Performance, seit jdk1.0). Da malt man viel
> mehr 'by-hand' (Graphics#drawSonstwas(...)) als bei normalen guis. Also macht sowas
> wie Antialiasing bei Swing viel weniger Sinn als hier...
Warum sollte selbstmalen bei Swing weniger Sinn machen als für AWT?
Oder habe ich das jetzt nur falsch verstanden?
Was ich meine: Wenn man mit Swing arbeitet, hat man nur in
Ausnahmefällen nicht Graphics2D.
>>
>> Der politisch korrekte Weg ist eigentlich:
>>
>> if ( g instanceof Graphics2D ) {
>> ...
>> }
>
> Das ist klar, aber was steht bei 'else'? ;)
> if (gfx instanceof Graphics2D) {
> // antialiasing setzen, was cooles malen
> } else {
> System.out.println("Tja, dummerweise kein Graphics2D...");
> }
Jepp so sieht es aus. Sogar die Beispiele des JAI gehen diesen Weg.
Wenn auch nicht konsequent. Manche Beispiele springen dann nur aus der
paint* Methode raus...
Deswegen hatte ich auch geschrieben: Man geht einfach davon aus, dass
man es hat. Ansonsten sucht man sich eine andere Komponente oder
andere Voraussetzungen. Wenn du mit einem Buffer arbeiten kannst, dann
ist das ja in Ordnung. Wenn man dem Flackern bei Animationen vorbeugen
will, ist das bei Nicht-Swing sowieso notwendig.
>> [...]
>>> Oder ist das je nach JRE-Version und OS immer mal anders?
>>
>> Sogar das könnte sein. Wenn es aber wirklich so wäre, müßte Sun eine
>> Menge Tutorials umschreiben ;-)
>
> Man weiß ja nie! ;)
Wenn ich es weiß, dann schreibe ich auch die Programme um :)
Es ist wohl eher anzunehmen, dass sich die Situation verbessert. Dh.
zum Beispiel, dass irgendwann DebugGraphics vielleicht auch ein
Graphics2D ist...
>>> Ich hab das bis jetzt immer so gemacht, dass ich ein BufferedImage als buffer
>>> benutzt habe, denn die createGraphics() Methode gibt ja sicher ein Graphics2D
>>> zurück. Dieses BufferedImage hab ich dann in die übergebene Graphics Instanz
>>> gemalt.
>>
>> Das würde ich auch machen, wenn ich HeavyWeight-Komponenten bemale.
>> Unter Swing nehme ich es (ehrlicherweise) als Sun-Gegeben hin.
>
> Engine2D extends Canvas -> heavyweight. Aber den Buffer brauche ich sowieso, also ist
> es _hier_ kein Problem.
Keine Ahnung woher Engine2D kommt. Ich kenne CanvasJAI und das Canvas
für Java3D. Bei dem einen weiß ich, dass ich ganz sicher ein
Graphics2D bekomme. Beim anderen sicher nicht. Das reicht eigentlich
als Sicherheit.
Gruß,
Josch.
--
Wale bestehen zu achtzig Prozent aus Lippenstift.
> [...]
> > In dem Fall habe ich es aber noch nie gebraucht. Jetzt, wo ich eine browserkompatible
> > 2D Engine bastle, brauch ich das AWT (Performance, seit jdk1.0). Da malt man viel
> > mehr 'by-hand' (Graphics#drawSonstwas(...)) als bei normalen guis. Also macht sowas
> > wie Antialiasing bei Swing viel weniger Sinn als hier...
>
> Warum sollte selbstmalen bei Swing weniger Sinn machen als für AWT?
> Oder habe ich das jetzt nur falsch verstanden?
OK, hab ich blöde formuliert: Ich meinte nicht Swing generell, ich meine, dass man sich bei
Swing selten selber um Komponenten kümmert, und dementsprechend selten komplexere
Zeichenvorgänge hat, bei denen man sowas brauchen würde.
Für Animationen, also wenn wirklich alles in custom paint methods geregelt wird, nehm ich
immer AWT, da es doch wesentlich schneller ist.
>
> Was ich meine: Wenn man mit Swing arbeitet, hat man nur in
> Ausnahmefällen nicht Graphics2D.
OK.
>
> [...]
> > Das ist klar, aber was steht bei 'else'? ;)
> > if (gfx instanceof Graphics2D) {
> > // antialiasing setzen, was cooles malen
> > } else {
> > System.out.println("Tja, dummerweise kein Graphics2D...");
> > }
>
> Jepp so sieht es aus. Sogar die Beispiele des JAI gehen diesen Weg.
> Wenn auch nicht konsequent. Manche Beispiele springen dann nur aus der
> paint* Methode raus...
Das iss übel. Einfach das Handtuch schmeißen... tztztz ;)
>
> Deswegen hatte ich auch geschrieben: Man geht einfach davon aus, dass
> man es hat. Ansonsten sucht man sich eine andere Komponente oder
> andere Voraussetzungen. Wenn du mit einem Buffer arbeiten kannst, dann
> ist das ja in Ordnung. Wenn man dem Flackern bei Animationen vorbeugen
> will, ist das bei Nicht-Swing sowieso notwendig.
Eben. Deswegen ist das bei der Engine jetzt auch kein Problem, ich meinte nur generell.
>
> [...]
> Es ist wohl eher anzunehmen, dass sich die Situation verbessert. Dh.
> zum Beispiel, dass irgendwann DebugGraphics vielleicht auch ein
> Graphics2D ist...
Tja, da kann man nur von besseren Zeiten träumen... ;) Aber DebugGraphics ist (IMHO) eh
völlig wurscht.
>
> [...]
> > Engine2D extends Canvas -> heavyweight. Aber den Buffer brauche ich sowieso, also ist
> > es _hier_ kein Problem.
>
> Keine Ahnung woher Engine2D kommt.
Sorry, wieder nicht eindeutig: Das ist die eigene Engine, die ich oben erwähnte, und die
ist von Canvas abgeleitet, also heavyweight.
> Ich kenne CanvasJAI und das Canvas
> für Java3D. Bei dem einen weiß ich, dass ich ganz sicher ein
> Graphics2D bekomme. Beim anderen sicher nicht. Das reicht eigentlich
> als Sicherheit.
yep.
>
> Gruß,
> Josch.
//Stephan
> Aljoscha Rittner schrieb:
>
>> [...]
>>> In dem Fall habe ich es aber noch nie gebraucht. Jetzt, wo ich eine browserkompatible
>>> 2D Engine bastle, brauch ich das AWT (Performance, seit jdk1.0). Da malt man viel
>>> mehr 'by-hand' (Graphics#drawSonstwas(...)) als bei normalen guis. Also macht sowas
>>> wie Antialiasing bei Swing viel weniger Sinn als hier...
>>
>> Warum sollte selbstmalen bei Swing weniger Sinn machen als für AWT?
>> Oder habe ich das jetzt nur falsch verstanden?
>
> OK, hab ich blöde formuliert: Ich meinte nicht Swing generell, ich meine, dass man sich bei
> Swing selten selber um Komponenten kümmert, und dementsprechend selten komplexere
> Zeichenvorgänge hat, bei denen man sowas brauchen würde.
Doch gerde bei Swing, weil man einfach mehr Möglichkeiten hat:
Renderer.
> Für Animationen, also wenn wirklich alles in custom paint methods geregelt wird, nehm ich
> immer AWT, da es doch wesentlich schneller ist.
Ich habe da etwas andere Erfahrungen gemacht. Aber ich mache zu wenig
mit Animationen. Es kann auch sein, dass ich kompletten Unsinn
verzapft habe. Das Zeichnen auf ein Canvas mit Graphics2D dauerte bei
mir deutlich länger als auf ein JPanel (5Megapixel Bild). Und ich
hatte exakt die Zeit im ms gemessen, die drawImage benötigt. Bei
JPanel lag es so in der Timer-Granularität (10-40ms) bei Canvas hatte
ich so zwischen 400 und 500ms.
[...]
>>> Das ist klar, aber was steht bei 'else'? ;)
>>> if (gfx instanceof Graphics2D) {
>>> // antialiasing setzen, was cooles malen
>>> } else {
>>> System.out.println("Tja, dummerweise kein Graphics2D...");
>>> }
>>
>> Jepp so sieht es aus. Sogar die Beispiele des JAI gehen diesen Weg.
>> Wenn auch nicht konsequent. Manche Beispiele springen dann nur aus der
>> paint* Methode raus...
>
> Das iss übel. Einfach das Handtuch schmeißen... tztztz ;)
Was willst du sonst machen? Du erfährst ja nicht mal vorher (im
Constructor), ob du später Graphics2D erhälst. Wenn du Exceptions in
paint wirfst, kann es sein, dass dabei die gesamte VM absemmelt.
Man könnte aber freundlicherweise ein drawString machen, damit man
Ansatzweise erkennt was los ist ;)
Gruß,
Josch.
--
Wie jagt man einen Elefanten: C- Programmierer bestimmen zuerst mit
sizeof() die nötige Speichermenge für einen Elefanten, versuchen diese
zu allozieren, vergessen dabei das Ergebnis abzuprüfen und schießen dann
mit wilden Pointern auf den Elefanten.
> [...]
>
> > Für Animationen, also wenn wirklich alles in custom paint methods geregelt wird, nehm ich
> > immer AWT, da es doch wesentlich schneller ist.
>
> Ich habe da etwas andere Erfahrungen gemacht. Aber ich mache zu wenig
> mit Animationen. Es kann auch sein, dass ich kompletten Unsinn
> verzapft habe. Das Zeichnen auf ein Canvas mit Graphics2D dauerte bei
> mir deutlich länger als auf ein JPanel (5Megapixel Bild). Und ich
> hatte exakt die Zeit im ms gemessen, die drawImage benötigt. Bei
> JPanel lag es so in der Timer-Granularität (10-40ms) bei Canvas hatte
> ich so zwischen 400 und 500ms.
Ups! Das werde ich dann mal besser testen!
>
> [...]
> > Das iss übel. Einfach das Handtuch schmeißen... tztztz ;)
>
> Was willst du sonst machen? Du erfährst ja nicht mal vorher (im
> Constructor), ob du später Graphics2D erhälst. Wenn du Exceptions in
> paint wirfst, kann es sein, dass dabei die gesamte VM absemmelt.
Die Erfahrung hab ich auch mal gemacht...
>
> Man könnte aber freundlicherweise ein drawString machen, damit man
> Ansatzweise erkennt was los ist ;)
Hach, wie nett! ;)
>
> Gruß,
> Josch.
//Stephan