Jak pobrać i zachować Graphics z komponentu ?

0

Witam

Mam takie pytanie jak pobrać w formie Graphics2D to co jest aktualnie wyświetlane na komponencie, tak jakby zrobić printscreena komponentu ;-)

Mam taki kod:

            java.awt.Graphics2D g2d = (java.awt.Graphics2D )komponent.getGraphics();
        
            g2d.setColor(Color.red);
            java.awt.Font thisFont = new java.awt.Font("Arial", java.awt.Font.PLAIN, 18);
            g2d.setFont(thisFont);
            g2d.drawString("GORyL", 30, 20);
            
            java.awt.Graphics2D grafoFota = g2d; //tu bym chciał zrobić screena który się zachowa bez zmian na wieki  ;-) tak że po jakimś czasie będzie go można znowu wyświetlić nie zależnie co się działo w między czasie, no ale ten zapis tego nie gwarantuje  :-( 
            
            jPanel1.paint(g2d); // a to o dziwo nie pomaluje mi Panelu1 na g2d tylko komponent na panel1  :/ 
0

pobaw się w szalonego genetyka i sklonuj obiekt ;)

Graphics2D grafoFota = (Graphics2D)g2d.clone();

ps. nie ma potrzeby pisać pełnych kwalifikowanych nazw pakietów. kompilator poradzi sobie z tym i dopisze co trzeba, a ty będziesz miał mniejszy i czytelniejszy wbrew pozorom kod źródłowy.

0

mowisz ze kompilator sam sobie cos dopisuje? hę?

0

A bo to jedną rzecz kompilator javy robi z automatu?
Przykładowo kompilator musi określić dokładnie z jakiej paczki idzie dana klasa. Obejrzyj zawartość plik .class a zobaczysz o co mi chodzi, a przecież nie musisz pisać pełnej kwalifikowanej nazwy klasy. W drugą stronę tzn. usuwanie też istnieje na przykład:

List<String> lista = new LinkedList<String>();

po kompilacji i dekopilacji będzie wyglądało w ten sposób:

List lista = new LinkedList();

a stanie się tak dlatego że generics jest usuwany w trakcie kompilacji. Służy tylko do kontroli typów i po sprawdzeniu poprawności jest wywalany. Z innych ciekawostek to w javie 1.5 masz autoboxing, czyli zamienianie typów podstawowych na obiekty.

0

Graphics2D grafoFota = (Graphics2D)g2d.clone();

netbeans mi mówi że: clone() has protected access in java.lang.Object
właściwie to nie wiem o co chodzi ?

0

genericowa skladnia to tylko dodatek, a kompilator sam nic nie usuwa, erasure to nie jest akcja kompilatora tylko nazwa na to ze w trakcie kompilacji wszelkie informacje o typie sa jakbo ignorowane, ale za to dodawane sa rzutowania czasami (np metody get() w List) - wiec tutaj masz racje :-)
autoboxing - ok dodaje konwersje :-)
ale nie wmowisz mi ze kompilator sam dodaje nazwy pakietow do nie prefixowanych klas - o ile mi wiadomo musisz zapodac importa? skad niby kompilator ma wiedziec o jaka klase ci w ogole chodzi?
ale to i tak offtopic

protected clone - chodzi o to ze clone instnieje, ale zeby moc klonowac dana klasa musi implementowac interfejs cloneable, i do tego musi nadpisywac metode clone zeby byla publiczna (oczywiscie tylko jesli chcesz ja wolac z zewnatrz pakietu, ale ty akurat chcesz)
przy czym ty nie mozesz zmienic kodu graphics2d wiec klonowania za pomoca tej metody nici

0

Co do importów to jest to naturalne bez tego ani rusz. Chyba że umiemy pisać za pomocą samego java.lang lub znamy na pamięć co gdzie leży:) Osobiście wydaje mi się ze taki kod, z importami bez kwalifikowanych nazw pakietów, jest czytelniejszy.

0

no wiadomo ze czytelniejszy
pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1