PDA

View Full Version : [JAVA] dove inserisco l'ascoltatore?


ali7.p
04-09-2006, 14:45
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!!!!



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();
}
}

andbin
04-09-2006, 15:22
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.

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.

ali7.p
04-09-2006, 21:16
il mio problema era e rimane che non volglio ridisegnare il pannello... ma che venga aggiunta un'auto ogni volta che clicco sul pannello...

andbin
04-09-2006, 21:27
il mio problema era e rimane che non volglio ridisegnare il pannello... ma che venga aggiunta un'auto 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.