Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    161

    dove inserisco l'ascoltatore?

    ho un problemino...

    Devo realizzare una GUI utilizzando le Swing in cui viene visualizzata un'auto in corrispondenza delle coordinate che individuano la posizione del mouse ognivolta che effettuo un click.
    Io ho creato la GUI, ho creato il metodo che disegna l'auto, ho creato anche l'asoltatore... ma dove lo inserisco?!

    ho provato a metterlo in tutti i punti, non riesco a farlo funzionare!!!!


    codice:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.lang.*;
    import java.awt.geom.*;
    
     class Auto extends JPanel{
    
        public static int x,y;
    
        public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2=(Graphics2D)g;
                g2.drawLine((x-10),(y-10),(x+10),(y-10) );
                g2.drawLine((x-10),(y-10),(x-20),y);
                g2.drawLine((x-20),y,(x-20),(y+10));
                g2.drawLine((x-20),(y+10),(x+30),(y+10));
                g2.drawLine((x+30),(y+10),(x+30),(y+5));
                g2.drawLine((x+30),(y+5),(x+10),(y-10));
                Area r1=new Area(new Ellipse2D.Double((x-10),(y+5),7,7));
                Area r2=new Area(new Ellipse2D.Double((x+15),(y+5),7,7));
                g2.fill(r1);
                g2.fill(r2);
          }
    }
    
     class AscPD extends  MouseAdapter {
        public void mouseClicked(MouseEvent e) {
                Auto.x=e.getX();
                Auto.y=e.getY();
        }
    }
    
     
    
    class VeicoliGUI extends JFrame {
    
        private Auto auto;  
    
        public VeicoliGUI(){
    
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                String s=getClass().getName();
                setTitle(s);
                setSize(600,400);
                setLayout(new BorderLayout());
    
                 Container c=getContentPane();
                auto=new Auto();
                c.add(auto);
                setVisible(true);
    
        }
    
         public static void main (String[] args) {
                VeicoliGUI p=new VeicoliGUI();
    
        }
    }

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

    Re: dove inserisco l'ascoltatore?

    Originariamente inviato da ali7.p
    Devo realizzare una GUI utilizzando le Swing in cui viene visualizzata un'auto in corrispondenza delle coordinate che individuano la posizione del mouse ognivolta che effettuo un click.
    Io ho creato la GUI, ho creato il metodo che disegna l'auto, ho creato anche l'asoltatore... ma dove lo inserisco?!

    ho provato a metterlo in tutti i punti, non riesco a farlo funzionare!!!!
    Ciao, la classe VeicoliGUI direi che va bene. Per il resto, ti posto il codice modificato per la classe Auto.

    codice:
    class Auto extends JPanel {
        public int x,y;
    
        public Auto()
        {
            addMouseListener (new MouseClickListener ());
        }
    
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2=(Graphics2D)g;
            g2.drawLine((x-10),(y-10),(x+10),(y-10) );
            g2.drawLine((x-10),(y-10),(x-20),y);
            g2.drawLine((x-20),y,(x-20),(y+10));
            g2.drawLine((x-20),(y+10),(x+30),(y+10));
            g2.drawLine((x+30),(y+10),(x+30),(y+5));
            g2.drawLine((x+30),(y+5),(x+10),(y-10));
            Area r1=new Area(new Ellipse2D.Double((x-10),(y+5),7,7));
            Area r2=new Area(new Ellipse2D.Double((x+15),(y+5),7,7));
            g2.fill(r1);
            g2.fill(r2);
        }
    
        class MouseClickListener extends MouseAdapter {
            public void mouseClicked(MouseEvent e) {
                x = e.getX();
                y = e.getY();
                repaint ();
            }
        }
    }
    Nota che ho tolto lo static nella dichiarazione di int x,y (perché volevi renderli "di classe" invece "di istanza"???).

    Inoltre ho sfruttato le classi innestate, che in questo caso solo l'ideale. Nel costruttore di Auto ho "registrato" il listener. E nel listener, imposto x/y e poi faccio un repaint.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    161
    il mio problema era e rimane, che non voglio fare il repaint!
    Non voglio che ll'auto si sposti dove clicco, ma ne vengo aggiunta un'akltra ogni volta che clicco sul pannello...

    (questa è una parte del programma, cancellazione e altre funzioni sono aggiunte da un ulteriore pannello di controllo)

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ali7.p
    il mio problema era e rimane, che non voglio fare il repaint!
    Non voglio che ll'auto si sposti dove clicco, ma ne vengo aggiunta un'akltra ogni volta che clicco sul pannello...
    Allora la cosa è un po' diversa.

    Quando viene chiamato il metodo paintComponent, il componente si deve preoccupare di (ri)disegnare tutto quello che serve. Quindi il repaint() non lo puoi evitare (può avvenire se ridimensioni la finestra, per esempio) e devi comunque chiamarlo a seguito di una modifica operata dall'utente (nel tuo caso l'aggiunta di una macchina).

    La soluzione quindi è quella di avere, al posto delle variabili x/y, una lista (ArrayList va bene) che contiene oggetti di tipo Point. Ad ogni click, aggiungi il punto alla lista e fai repaint(). Nel metodo paintComponent scansioni la lista e disegni tutte le macchine.
    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
    Jul 2006
    Messaggi
    161
    ok, GARZIE!!
    pare chiaro... spero di non riscontrare altri problemi...

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.