Newsgroup: it.comp.java
Titolo: Class Graphics

Sto facendo un'applet e quando devo disegnare delle linee lo faccio sotto la
proc. paint e tutto funziona fino a quando non ho aggiunto un pannello e su
questo non riesco a disegnare una linea...
    ...
    public void paint(Graphics g){
    ...
l'oggetto Graphics che utilizza la procedura paint a chi si riferisce?
    ...
    nomePannello.getGraphics();
    ...
mi restituisce la "grafica" relativa al mio pannello, come faccio ad operare
su di essa?
Grazie anticipatamente e non disturberò più se mi lasciate anche i link di
siti con esempi pratici, documentazioni, ecc... sul java.

 ha scritto nel messaggio
news:9d903c$nqi$1...@diesel.cu.mi.it...

Non conosco link! Ma il g che ottieni, è quello del pannello. Se disegni su
quel g, disegni sul pannello! Ma ciò non vuol dire che hai modificato il
codice del metodo paint del pannello. Quello resta sempre lo stesso e alla
prima chiamata di repaint, se non richiedi ancora il g, le tue linee
verranno cancellate.


C'è differenza fra il paint del pannello e il paint dell'applet?
Come faccio a costruire due procedure diverse con le chiamate:
-repaint();
-NomePannello.repaint();
In altre parole com'è ilo meccanismo di chiamata a procedura? (paint,
repaint, update, ecc...)
      public void paint(Graphics g){
            g=pnlVerde.getGraphics();
            g.drawLine(100,410,100,500);
      }

 news:3af8...@news.cis.it...
Il metodo paint dell'applet e quello del pannello portano lo stesso nome, ma
sono due cose ben differenti. Se disegni nel paint dell'applet le modifiche
le vedi sullo sfondo della tua applet, senza che interferisca col pannello.
In Java, ogni metodo che si occupa di disegnare un componente, prende il
nome di public void paint(Graphics g). Quindi ogni oggetto che estende la
classe component, ha un metodo paint al suo interno, della forma public void
paint(Graphics g).
Ogni qualvolta si voglia ridipingere un oggetto (in pratica il suo refresh,
per esempio un bottone che cambia immagine quando lo premi), si effettua una
chiamata a repaint(), che a sua volta estrae il graphics (che chiamiamo
g)dell'oggetto e ne chiama il suo metodo update, passandogli g. update,
effettua solo la ripulitura dell'oggetto, in pratica lo riempie con un
colore, e poi chiama paint, dopo aver settato il colore di disegno.
Quindi repaint->update->paint.
Nel tuo pezzetto di codice inizialmente g è quello dell'applet, poi diventa
quello del pannello.
Ora, tu stai utilizzando dei componenti che già esistono, come Panel. Non
puoi modificare il codice del suo metodo paint, perchè per farlo, dovresti
riscriverlo all'interno della classe Panel, giusto? Per chiarirti meglio
questo discorso: l'unico modo che hai per modificare il codice di un metodo
di un oggetto, è cambiare quel codice all'interno della definizione della
classe stessa. Es:
public class pippo {
    public void prova() {
        System.out.println("Ciao");
    }
}
public class grande {
    pippo oggetto=new pippo();
    oggetto.prova();
}
Come vedi se tu volessi cambiare il metod prova direttamente con qualche
operazione dalla classe grande, non potresti. Se tu volessi cambiarlo
dovresti per forza di cose andare nel codice di pippo e rimodificare il
metodo prova(). Lo stesso discorso vale per il metodo paint del tuo
pannello. Non puoi modificarlo perchè non hai accesso al codice del metodo
paint. Puoi effettivamente ricavare il suo graphics e usare quello da
qualsiasi punto dell'applet per disegnargli sopra qualcosa, ma non riuscirai
mai a stare dietro alle chiamate repaint che il browser effettua.
La soulzione però esiste ed è banalissima nonchè facilissima: basta che crei
una classe che eredita da Panel e allora ne ridefinisci il codice e sei a
cavallo!! Ti faccio un esempio di un NuovoPanel che contiene una scritta al
suo interno anzichè essere vuoto come tutti i Panel!
public class NuovoPanel extends Panel {
    public void paint(Graphics g) {
        g.drawString("Scritta scritta!",30,30);
    }//end metodo paint
}//end classe NuovoPanel
Dopo, nella tua applet creerai un oggetto di tipo NuovoPannello anzichè
Pannello e sarai a posto! Come vedi non è neanche necessario ridefinire il
metodo update.
Spero di essere stato esauriente e chiaro! Comunque, in caso di bisogno,
riposta come al solito!! Ciao e buon lavoro!