Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    83

    Graphics g e Graphics2D g2

    Non capisco la differenza tra un oggetto Graphics e un oggetto Graphics2D...

    Cosa cambia?

    public void paint(Graphics g) // oggetto Graphics
    {
    Graphics2D g2 = (Graphics2D)g; // Perchè questo cambiamento(cast)?
    }
    Perchè si effettua questa operazione? Non potevo mettere nel metodo paint direttamente un parametro diretto come questo: Graphics2D g2?

    :master:
    #include <pgnvni.h>

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Graphics g e Graphics2D g2

    Originariamente inviato da pgnvni
    Non capisco la differenza tra un oggetto Graphics e un oggetto Graphics2D...

    Cosa cambia?



    Perchè si effettua questa operazione? Non potevo mettere nel metodo paint direttamente un parametro diretto come questo: Graphics2D g2?

    :master:
    Primo: non puoi mettere Graphics2D direttamente nel parametro di paint() perché altrimenti non faresti un override del metodo paint.

    Secondo: a partire da Java 2, l'oggetto realmente passato ai metodi di paint è in effetti di tipo Graphics2D.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: Graphics g e Graphics2D g2

    Originariamente inviato da andbin
    Primo: non puoi mettere Graphics2D direttamente nel parametro di paint() perché altrimenti non faresti un override del metodo paint.

    Secondo: a partire da Java 2, l'oggetto realmente passato ai metodi di paint è in effetti di tipo Graphics2D.
    quindi ora esiste il metodo paint con un parametro di tipo Graphics2D???

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: Graphics g e Graphics2D g2

    Originariamente inviato da ascatem2
    quindi ora esiste il metodo paint con un parametro di tipo Graphics2D???
    No, una cosa è il tipo del reference dichiarato e una cosa è il tipo dell'oggetto realmente passato!!!

    Il metodo paint che tu scrivi deve essere e restare (altrimenti non fai un override):
    codice:
    public void paint(Graphics g)
    {
        ....
    }
    Poi quando il metodo viene chiamato, gli viene passato un oggetto di tipo Graphics2D (che è una sotto-classe di Graphics).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    83
    Se non mi sbaglio il metodo draw prende come parametro un oggetto di tipo Graphics2D vero?

    Ma che cambia dal metodo draw a quello paint?

    Comunque ho letto che il riferimento mediante cast "(Graphics2D)g;" è stato utilizzato perchè agli inizi della prima versione di Java, la grafica non era orientata agli oggetti.
    #include <pgnvni.h>

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da pgnvni
    Se non mi sbaglio il metodo draw prende come parametro un oggetto di tipo Graphics2D vero?
    No, il metodo draw(Shape s) lo si esegue su un oggetto di tipo Graphics2D.

    Originariamente inviato da pgnvni
    Ma che cambia dal metodo draw a quello paint?
    Ma stai sempre parlando del metodo draw(Shape s) della classe Graphics2D?? paint() invece è un metodo di un Component.

    Originariamente inviato da pgnvni
    Comunque ho letto che il riferimento mediante cast "(Graphics2D)g;" è stato utilizzato perchè agli inizi della prima versione di Java, la grafica non era orientata agli oggetti.
    Non c'entra una mazza ... :rollo:

    Ripeto per l'ennesima volta: il metodo paint riceve un Graphics. Questo vuol dire che l'oggetto realmente passato può essere di tipo Graphics o di una sotto-classe di Graphics. E infatti Graphics2D è una sua sotto-classe.

    Il cast lo fai se stai lavorando con Java 2 e ti interessa usare il Graphics2D.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Originariamente inviato da andbin
    Il cast lo fai se stai lavorando con Java 2 e ti interessa usare il Graphics2D.
    e allora mi chiedo perché gli sviluppatori di java non abbiano fatto anche un metodo paint con parametro Graphics2D così da non obbligare gli utenti a fare cast....

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ascatem2
    e allora mi chiedo perché gli sviluppatori di java non abbiano fatto anche un metodo paint con parametro Graphics2D così da non obbligare gli utenti a fare cast....
    Per molte buone ragioni ...

    Fin dagli inizi di Java, il metodo paint() della classe Component, ha come parametro un Graphics. Se andate a vedere nei sorgenti di Java, il metodo paint() di Component è vuoto:
    codice:
        public void paint(Graphics g) {
        }
    non fa nulla. Questo perché sono le sottoclassi di Component a dover, se necessario, fare l'override del metodo per poter disegnare effettivamente qualcosa di specifico.

    Con l'avvento di Java 2, non potevano aggiungere un secondo metodo paint con il Graphics2D e nemmeno modificare il metodo paint per avere già nel parametro un Graphics2D.
    Per diversi motivi.

    Se per ipotesi, ci fossero stati 2 metodi paint (uno con Graphics e l'altro con Graphics2D) già non avrebbe avuto molto senso. Poi comunque con Java 2 verrebbe chiamato solo un metodo, cioè presumibilmente quello con Graphics2D. Ma eventuali applicazioni già esistenti che usano paint(Graphics) non avrebbero più funzionato.
    Idem se per ipotesi avessero lasciato un solo paint ma con Graphics2D. Una vecchia applicazione non avrebbe più funzionato. Se una vecchia applicazione usa paint(Graphics), non sarebbe stato certo un override di paint(Graphics2D)!!

    Ecco perché l'unica soluzione è stata quella di estendere il Graphics creando una sotto-classe Graphics2D e sfruttando quindi il polimorfismo. Dal momento che un Graphics2D è un Graphics, tutte le applicazioni già esistenti continuano a funzionare.
    In più se io so che sto sviluppando con Java 2, so che l'oggetto passato in realtà è un Graphics2D. Faccio il cast e lo uso ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.