Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - super.paintComponent() e addMouseListener?!
Forum - Java - super.paintComponent() e addMouseListener?!

Avatar
BlackTazz (Normal User)
Newbie


Messaggi: 9
Iscritto: 15/08/2009

Segnala al moderatore
Postato alle 13:52
Domenica, 16/08/2009
Ciao a tutti, vi scrivo perchè ho alcune perplessità sulla realizzazione di una classe che stò realizzando. E' una classe molto semplice....simula lo spostamento di un rettangolo su un frame...io l'ho realizzata così: (E' formata da 2 classi)

import java.awt.Rectangle;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;

public class RectangleComponent extends JComponent
{

private Rectangle box;

    public RectangleComponent()
    {
        box = new Rectangle(0,0,100,50);
    }

    public void paintComponent(Graphics g)
    {
        
        Graphics2D g2 = (Graphics2D) g;
        g2.draw(box);
        
    }
    
    public void moveBy(int x, int y)
    {
        box.translate(x,y);
        repaint();
    }
}

import java.awt.Rectangle;
import javax.swing.Timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.*;

public class RetangleMover
{
    public static void main(String [] args)
    {
        final RectangleComponent box = new RectangleComponent();
        
        class TimerListener implements ActionListener
        {
            public void actionPerformed(ActionEvent event)
            {
                box.moveBy(1,1);
            }
        }
        
        JFrame frame = new JFrame();
        frame.setSize(600,450);
        frame.setTitle("RectangleMover");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.add(box);
        ActionListener listener = new TimerListener();
        Timer t = new Timer(100, listener);
        t.start();
    }
}


Ora per funzionare funziona, nn c'è alcun problema di questo tipo, MA quando sono andato a controllare sul libro lui ha messo 2 cose che io nn ho messo e sarebbero queste:

- Nel metodo paintComponent della classe RectangleComponent prima di richiamare la classe Graphics2D scrive questo comando "super.paintComponent(g);" O.o
Ma che diavolo è?! Mai visto in vita mia, mai spiegato dal libro e senza un motivo mi arriva nel codice...e tra l'altro non ne capisco l'utilità visto che il mio programma senza avercelo funziona lo stesso :doubt:
E cos'è l'oggetto super tra l'altro?! Insomma è davvero un mistero x me...

-La seconda cosa che mette il libro che io non ho messo è nel metodo main questa riga di codice "component.addMouseLinstener(listener);" O___O
Qui rimango ancora + perplesso perchè intanto non capisco cosa centri un MouseListener con un rettangolo che si muove usando sempicemente un Timer, e tra l'altro "listener" NON E' un MouseListener ma un ActionListener...cosa ancora + "divertente" è che il programma così neanche funziona (ovviamente secondo me)....quindi proprio non capisco ogni tanto che abbiano questi esercizi...

Mi potreste illuminare su questi 2 comandi? Diciamo + sul 1° visto che il 2° credo sia un errore di stampa...

Ah e un altra cosa...x far partire il timer devo usare il metodo start(), per fermarlo stop(), ma come funziona bene? Cioè quando eseguo il programma e arriva alla riga start(), si ferma su quel metodo x sempre o continua a leggere e se c'è uno stop() 1 riga dopo paradossalmente si fermerebbe subito?
E se fosse così allora come farei a dirgli di far durare l'animazione solo 5 secondi?

Grazie,
Franz

Ultima modifica effettuata da BlackTazz il 16/08/2009 alle 13:54
PM Quote
Avatar
HEAD (Normal User)
Rookie


Messaggi: 25
Iscritto: 04/08/2009

Segnala al moderatore
Postato alle 17:06
Domenica, 16/08/2009
Testo quotato

Postato originariamente da BlackTazz:

Ciao a tutti, vi scrivo perchè ho alcune perplessità sulla realizzazione di una classe che stò realizzando. E' una classe molto semplice....simula lo spostamento di un rettangolo su un frame...io l'ho realizzata così: (E' formata da 2 classi)

import java.awt.Rectangle;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;

public class RectangleComponent extends JComponent
{

private Rectangle box;

    public RectangleComponent()
    {
        box = new Rectangle(0,0,100,50);
    }

    public void paintComponent(Graphics g)
    {
        
        Graphics2D g2 = (Graphics2D) g;
        g2.draw(box);
        
    }
    
    public void moveBy(int x, int y)
    {
        box.translate(x,y);
        repaint();
    }
}

import java.awt.Rectangle;
import javax.swing.Timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.*;

public class RetangleMover
{
    public static void main(String [] args)
    {
        final RectangleComponent box = new RectangleComponent();
        
        class TimerListener implements ActionListener
        {
            public void actionPerformed(ActionEvent event)
            {
                box.moveBy(1,1);
            }
        }
        
        JFrame frame = new JFrame();
        frame.setSize(600,450);
        frame.setTitle("RectangleMover");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.add(box);
        ActionListener listener = new TimerListener();
        Timer t = new Timer(100, listener);
        t.start();
    }
}


Ora per funzionare funziona, nn c'è alcun problema di questo tipo, MA quando sono andato a controllare sul libro lui ha messo 2 cose che io nn ho messo e sarebbero queste:

- Nel metodo paintComponent della classe RectangleComponent prima di richiamare la classe Graphics2D scrive questo comando "super.paintComponent(g);" O.o
Ma che diavolo è?! Mai visto in vita mia, mai spiegato dal libro e senza un motivo mi arriva nel codice...e tra l'altro non ne capisco l'utilità visto che il mio programma senza avercelo funziona lo stesso :doubt:
E cos'è l'oggetto super tra l'altro?! Insomma è davvero un mistero x me...

-La seconda cosa che mette il libro che io non ho messo è nel metodo main questa riga di codice "component.addMouseLinstener(listener);" O___O
Qui rimango ancora + perplesso perchè intanto non capisco cosa centri un MouseListener con un rettangolo che si muove usando sempicemente un Timer, e tra l'altro "listener" NON E' un MouseListener ma un ActionListener...cosa ancora + "divertente" è che il programma così neanche funziona (ovviamente secondo me)....quindi proprio non capisco ogni tanto che abbiano questi esercizi...

Mi potreste illuminare su questi 2 comandi? Diciamo + sul 1° visto che il 2° credo sia un errore di stampa...

Ah e un altra cosa...x far partire il timer devo usare il metodo start(), per fermarlo stop(), ma come funziona bene? Cioè quando eseguo il programma e arriva alla riga start(), si ferma su quel metodo x sempre o continua a leggere e se c'è uno stop() 1 riga dopo paradossalmente si fermerebbe subito?
E se fosse così allora come farei a dirgli di far durare l'animazione solo 5 secondi?

Grazie,
Franz  




Ciao Frank... ma dove hai trovato il libro? :yup:
scherzo.. in questo caso credo non c'è nessun errore di stampa..

rispondendo alla prima domanda.. il super richiama la classe padre che contiene in questo caso il metodo, paintComponent(), in poche parole non fa altro che rimettere l'azione nelle nani del padre, quindi se si dovrebbero verificare problemi sarà il padre a gestirli, con i vari metodi che conterrà all'interno della sua classe..

-----------
per quanto riguarda la classe javax.swing.Time
puo gestire solo delle ActionListener e non MouseListner

ma mi chiedo se devi avere il controllo sul rettangolo creato, il Time come classe non e ideale ad assolvere questo compito anche perche dovresti abbinare all'oggetto degli eventi per il controllo , ecco perchè nel libro tu trovi questa voce component.addMouseLinstener, perche lui all'oggetto addizione gli eventi che ha creato nella classe TimerListener che in questo caso dovrebbe implementare MouseListner e non ActionListner

per avere un controllo sull'oggetto settando i secondi dell'animazione etc, etc
credo che il codice che hai scritto non basti dovresti creare una classe interna che estende da Thread col suo metodo void e gestire il tutto, in questo modo col tuo thread potrai avere il controllo sull'oggetto..
tipo faccio clic col mouse e parte l'animazione , rifaccio doppio clic e si ferma, oppure parte e si ferma dopo tot. secondi.. o entro in un area col mouse e il rettangolo cambia posizione etc, etc,
io ho fatto un esempio della tua classe RetangleMover

potrebbe venire cosi.. prova gli eventi, non ho avuto tempo di commentarla ma ti appena torno se vorrai te la commento passo, passo..

import java.awt.event.MouseEvent;
import java.awt.event.ActionEvent;
import java.awt.event.MouseListener;
import javax.swing.*;

public class RetangleMover {

    RectangleComponent box = new RectangleComponent();
    myTimer time = new myTimer();
    boolean action = true;

    public RetangleMover() {
        init();
        TimerListener listner = new TimerListener();
        box.addMouseListener(listner);


    }

    class TimerListener extends AbstractAction implements MouseListener {

        public void actionPerformed(ActionEvent event) {
        }

        public void mouseClicked(MouseEvent e) {

            if (e.getClickCount() == 2) {
                time.stops();
            }
            if (e.getClickCount() == 1) {

                if (!time.b_bol) {

                    time = new myTimer(50);
                    time.start();

                    action = false;
                }
            }
        }

        public void mousePressed(MouseEvent e) {
        }

        public void mouseReleased(MouseEvent e) {
        }

        public void mouseEntered(MouseEvent e) {

            if (!action) {
                time.stops();

            }
        }

        public void mouseExited(MouseEvent e) {
        }
    }

    private void init() {
        JFrame frame = new JFrame();
        frame.setSize(600, 450);
        frame.setTitle("RectangleMover");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(box);
        frame.setVisible(true);

    }

    public class myTimer extends Thread {

        boolean b_bol = false;
        int count = 0;
        int tempo_durata = 0;

        public myTimer() {
        }

        public myTimer(int tempoDurata) {
            this.tempo_durata = tempoDurata;
        }

        public void run() {
            count = 0;
            while (b_bol) {
                count++;


                if (count == getTempo_durata()) {
                    stops();
                    count = 0;
                }


                try {
                    box.moveBy(1, 1);
                    sleep(100);
                } catch (Exception ex) {
                }

            }


        }

        public void stops() {
            b_bol = false;
        }

        public void start() {
            b_bol = true;
            Thread t = new Thread(this);
            t.start();
        }

        public int getTempo_durata() {
            return tempo_durata;
        }

        public void setTempo_durata(int tempo_durata) {
            this.tempo_durata = tempo_durata;
        }
    }

    public static void main(String[] args) {

        new RetangleMover();

    }
}

--------------
in questo modo hai il controllo sull'oggetto e puoi istruirlo a tuo piacimento
io gli ho messo dei metodi che lo avviano al clic e si ferma dopo 5 secondi , poi clicchi di nuovo e parte , ma se clicchi due volte si ferma...
spero possa esserti d'iuto ciao a dopo...

PM Quote
Avatar
BlackTazz (Normal User)
Newbie


Messaggi: 9
Iscritto: 15/08/2009

Segnala al moderatore
Postato alle 21:04
Domenica, 16/08/2009
Il programma che hai fatto va che è una meraviglia...il piccolo problema è che nn ho ancora trattato i Thread quindi nn so cosa tu abbia fatto ^^
Cmq se ho capito bene, con il codice che ti ho postato prima, aggiungere (come ha fatto il libro) da nulla quel addMouseListener nel main a quel component senza neanche aver implementato l'interfaccia MouseListener è x forza un errore d stampa no?
E per quel che riguarda il super.paintComponet() ho capito ora che richiama il "padre", ma non ne vedo l'utilità dato che ho già esteso JComponent quindi il paintComponent che invoco non è già quello del padre?!


PM Quote
Avatar
HEAD (Normal User)
Rookie


Messaggi: 25
Iscritto: 04/08/2009

Segnala al moderatore
Postato alle 2:18
Lunedì, 17/08/2009
Ciao Frank , sono tornato da poco da un mega giro con amici, a volte bisogna staccare la spina..
allora tornado al codice e alle tue perplessità,
1)riguardo al metodo > super.paintComponent(g),
se consulti la documentazione sun, javax.​swing.​JComponent, ti accorgerai che paintComponent lo dichiara protect , quindi può essere utilizzato dalle classi figlie, ma non può essere chiamato per utilizzo dagli oggetti di classe padre, quindi a maggior ragione che si invoca la super.. vediamo a cosa serve e cosa fa..
     protected void paintComponent(Graphics g) :
    Invita l'utente delegato del metodo paint,, se l'utente delegato non è nullo.  passa al delegato una copia della grafica oggetto, e  protegge il resto del codice  paint da irrevocabili modifiche (ad esempio, Graphics.translate).
Se su questo metodo in una sottoclasse non si devono rendere permanenti le modifiche al passaggio in Grafica. Ad esempio, quando  non si dovrebbe modificare il clip Rettangolo o modificare la trasformazione. Quando  ce bisogno di fare queste operazioni che possono rendere più facile la  creazione di una nuova grafica del passaggio in Grafica e manipolarla. Inoltre, cosa buona quando si invoca SUPER  invocare anche le proprietà opaco, perchè se questo componente è opaco, è necessario compilare completamente il background in modo non-colore  opaco. Se non si invocherebbe il metodo  opaco si potrebbero vedere artefatti visivi.

2)riguarda l'esercizio,
QUESTA ERA LA TUA PERPLESSITA :
aggiungere (come ha fatto il libro) da nulla quel addMouseListener nel main a quel component senza neanche aver implementato l'interfaccia MouseListener è x forza un errore d stampa no?  
---------------------------------------------------------------------------------------------------------------------
io credo che lo puoi fare anche tu, e non sia un errore di stampa,  nella classe che implementi ActionLister, implementa anche MouseListner
e il quella classe istanzia la classe TIME nel costruttore della classe Time gli passi i millesecondi e this)< che sarebbe l'actionListner , implementata la MouseListner avrai a disposizione i vari tipi di eventMause clic, enter, exit, etc,etc, in questi puoi gestire il start e il stop.. dell'animazione..
Nel main al box addizione actionMouseListener e nel costruttore gli passi new della classe eventi che hai creato Emspio:
box.addMouseListener(new TimerListener());
il tutto funziona puoi avere la gestione dello stop e start ..
adesso ti incollo la classe come l'ho scritta e come credo che intende fare il libro..
Esempio:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;

public class RetangleMover
{
    public static void main(String [] args)
    {
        final RectangleComponent box = new RectangleComponent();

        class TimerListener  implements ActionListener, MouseListener  
        {
            Timer t = new Timer(100, this);
          
            public void actionPerformed(ActionEvent event)
            {
            
             box.moveBy(1,1);
            }

            public void mouseClicked(MouseEvent e) {
               if(e.getClickCount()==2){
               t.stop();
               }else
                   t.start();

            }

            public void mousePressed(MouseEvent e) {
              
            }

            public void mouseReleased(MouseEvent e) {
              
            }

            public void mouseEntered(MouseEvent e) {
            
            }

            public void mouseExited(MouseEvent e) {
              
            }
        }

        JFrame frame = new JFrame();
        frame.setSize(600,450);
        frame.setTitle("RectangleMover");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.add(box);
    
        box.addMouseListener(new TimerListener());
    }
}

in questo modo puoi usufruire dello start e stop della classe Time.
1 clic parte l'animazione , 2 clic si ferma...
copia il codice e prova..

spero di esserti stato d'aiuto .. ciao  
adesso a nanna ahahhaahah...:cheer:

PM Quote
Avatar
BlackTazz (Normal User)
Newbie


Messaggi: 9
Iscritto: 15/08/2009

Segnala al moderatore
Postato alle 20:40
Giovedì, 20/08/2009
Scusa se ti rispondo tardi ma non ho la rete...tele2 nn mi funziona + O.o (sono collegato al vicino ahahah ^^)
Ma io, sarò scemo, ma continuo a non capire bene questo super.ecc
E tutta questa cosa del component opaco eccetra non ho capito un granchè...
Praticamente nel mio libro non ha mai parlato della classe JComponent, la usa e basta, e dice che crea un componente vuoto, poi usa graphics, ma dice solo che memorizza il font, graphics2D mi ha detto solo che è una sottoclasse di graphics e che è astratto (che nn so cosa significhi) e fine, io non so altro sui component e quello che li riguardano...:(

E tra l'altro non capisco perchè quando creo un applet molti non lo visualizzano bene (e anche io su alcuni miei pc), ad esempio in questo qui:

import javax.swing.JApplet;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;

public class Rettangolo extends JApplet
{
    public void paint(Graphics grafica)
    {
        super.paint(grafica);
        Graphics2D grafica2 = (Graphics2D) grafica;
        Rectangle franz = new Rectangle(50,50,300,200);
        grafica2.draw(franz);
    }
}

Che è un normalissimo rettangolo disegnato, se ci passi sopra una finestra di msn o di qualsiasi cosa sopra, ne rimane l'immagine sullo schermo...la stessa cosa succede se vai a piè di pagina e torni su, vedi pezzi di rettangolo ridisegnarsi...insomma non cosa cosa abbia che non va! Non posso sbagliare un codice così semplice!
E se provo a fare disegni magari un pò + articolati e uso anche super.paint(g); x vedere se magari la situazione migliora, a volte non vedo proprio il mio disegno e al suo posto c'è un rettangolo grigio delle dimensioni che ho fissato all'applet...e come rettangolo nn intendo il disegno di un rettangolo, semplicemente l'area dell'applet diventa tt grigia!
Cosa c'è che nn va?
Grazie, Franz ;)


PM Quote
Avatar
BlackTazz (Normal User)
Newbie


Messaggi: 9
Iscritto: 15/08/2009

Segnala al moderatore
Postato alle 22:58
Martedì, 25/08/2009
Scusate il doppio post, ma a distanza d 5gg nessuno ha ancora risposto, e volevo sapere se ero stato poco chiaro, se nn c'era nessuno, se non lo sapete, qualsiasi cosa ma datemi almeno un segno di vita :rotfl:

PM Quote
Avatar
HEAD (Normal User)
Rookie


Messaggi: 25
Iscritto: 04/08/2009

Segnala al moderatore
Postato alle 22:18
Mercoledì, 26/08/2009
Ciao Franz,

come và? ancora problemi? e chi non ne ha! :-))
per capire più approfonditamente determinati passi
dovresti andare avanti con gli studi, per quanto riguarda le tue perplessità sul, super e costruttore ho trovato un po informazione su internet che ti consiglio di leggere
ad esempio ce questa diapositiva molto comprensibile ti spiega passo passo,
ti consiglio di vederla:
http://www.slideshare.net/davidef/java-02

come ti consiglio questi link sono tutti inerenti alle tue perplessità:
http://it.wikipedia.org/wiki/Classe_astratta
http://www.troppoavanti.it/lavoro/javanotes.it/c4/s4.html
http://www.dis.uniroma1.it/~liberato/gestionale/costruttor ...
http://www.disi.unige.it/person/MagilloP/P2_SMID07/lez02.html

altro:
nella speranza che puo esserti d'aiuto

ti allego un file.zip con un pò di materiale l'ho trovato sfogliando un vecchio cd allegato
ad un libro di java inerente allo sviluppo di applicazioni grafiche e reti ..
all'interno troverai una cartella di nome Demo Sun in questa cartella troverai un programmino del nome SwingSet.jar , questo puo aiutarti molto a scoprire nuove tecniche ,
in effetti questo programma contiene tanti esempi con la possibilità di visualizzare il codice, te lo guardi un po cosi incominci a vedere come puoi fare determinati passi
in più ci sono moto altri progetti con sorgente , come il gioco delle carte , della dama, applicare grafica ad oggetti Swing rendendoli personalizzati, e tanto altro.. ti potrà essere utile in qualsiasi momento hai bisogno di ricordare determinati passi per la grafica ed altro...

ha se ti interessa il nome del libro e : Java sviluppare applicazioni grafiche e programmare in rete , della HOEPLI informatica..
autori : Paolo Camagni e Riccardo Nikolassy,
un libro di 352 pagine,  
costo euro 14,90 comprende anche il CD

ok.. buon lavoro Ciao


mi spiace non posso allegarti tutti i sorgenti perche supera 2 MB per il momento ti allego solo il programmino con gli esempi , ma se li vuoi tutti te li posso allegare con una email se mi dai il tuo indirizzo email ok... ciao..


HEAD ha allegato un file: Demo Sun.zip (1488479 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da HEAD il 26/08/2009 alle 22:29
PM Quote
Avatar
BlackTazz (Normal User)
Newbie


Messaggi: 9
Iscritto: 15/08/2009

Segnala al moderatore
Postato alle 14:33
Giovedì, 27/08/2009
HEAD sei proooo :hail:
Ora dammi il tempo d finire gli esami arretrati che devo dare a settembre ( Analisi I, Fisica, programmazione algoritmi :om: ) e poi inizio a studiarmi meglio tutte le cose che mi hai postato e mi prendo quel libro, poi torno qui sul forum x dirti come è andata o, + probabilmente, x dire che ho altri problemi :rofl:

Vado a studiare, grazie ancora, ciauz :k:

Ultima modifica effettuata da BlackTazz il 27/08/2009 alle 14:35
PM Quote