2011-07-13 16 views
8

Eksperymentowałem z Graphics2D w Javie. Ale jak zwykle utknąłem. : P Problem jest: Załóżmy, że mam tego kodu,Resetowanie obiektu Graphics2D w Javie

Graphics2D g=(Graphics2D)(this.getGraphics()); //Inside a JFrame 
g.rotate(Math.PI/8); 
g.drawLine(10, 20, 65, 80); 

//I want this one and all following lines to be drawn without any rotation 
g.drawLine(120, 220, 625, 180); 

Czy to możliwe ??? Wiem, że musi być jakiś sposób, ale nie jestem w stanie tego rozgryźć. Proszę pomóż.

Odpowiedz

14

Co chcesz zrobić, to przywrócić transformację.

Spróbuj

AffineTransform oldXForm = g.getTransform(); 
g.rotate(...); 
g.drawLine(...); 

g.setTransform(oldXForm); // Restore transform 
g.drawLine(...); 
+1

Ponadto zaleca się, aby użyć kopii obiektu graficznego, a nie samego obiektu graficznego, aby uniknąć dzwonienia, ponieważ będzie on używany w innym miejscu. – mre

+0

czy możesz wyjaśnić? co masz na myśli mówiąc "clobbering"? –

+2

Czasami masz już obiekt 'Graphics' i chcesz tymczasowo zmienić jego stan, a następnie przywrócić go do pierwotnego stanu. Jednym ze sposobów jest stworzenie nowego obiektu 'Graphics', który jest kopią oryginału i zamiast tego wprowadzanie zmian do tej kopii. Ta technika pozwala uniknąć stanu oryginalnego obiektu, na którym mogą polegać inne części Swinga. To może nie mieć zastosowania w tym przypadku, ale pomyślałem, że nie zaszkodzi wspomnieć! :) – mre

4

połączenia getTransform() (daje kopię), obracanie, rysować, a następnie użyć setTransform() aby przywrócić stan. Model docs for setTransform() ma nawet przykład.