PDA

View Full Version : [java] problemino


DimeCfh91
26-02-2010, 15:46
ciao ragazzi, devo svolgere un programma che comprende la gestione del mouse.
Praticamente al mio click deve apparire un cerchio con il centro nelle coordinate dove ho cliccato. Perņ non riesco a capire cosa sbaglio nel metodo paint visto che non mi stampa niente!
Questo č il codice che ho scritto:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class cerchiomouse extends JFrame implements MouseListener
{
int coox,cooy,cont=0;
int r=10;
Area cerchio = new Area();

public void finestra()
{
setSize(400,400);
cerchio.addMouseListener(this);
this.addMouseListener(this);
setVisible(true);
add(cerchio);
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseClicked(MouseEvent e)
{
cont = cont+1;
coox=e.getX();
cooy=e.getY();
repaint();
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}

class Area extends Canvas
{
public void paint(Graphics g)
{
if (cont>0)
{
g.setColor(Color.black);
g.fillOval(coox+r,cooy+r,r*2,r*2);
}
}
}
}



praticamente io clicco dentro la finestra e grazie a bluej vedo i valori delle variabili, queste effettivamente cambiano quindi non avrei un problema di coordinate perņ non mi mostra niente, da cosa puņ dipendere?

banryu79
27-02-2010, 12:02
Dipende dal fatto che la tua classe Area estende Canvas e Canvas fa parte di AWT, mentre quando invochi il metodo repaint() nel tuo mouse listener, stai chiamando il metodo repaint di JFrame, che fa parte di Swing.

Il "Painting Framework" di AWT č diverso da quello di Swing; i meccanismi per disegnare sono diversi fra loro.

Se vuoi approfondire puoi cominciare leggendo questo:
http://java.sun.com/products/jfc/tsc/articles/painting/index.html

Per quanto riguarda il tuo codice, io vedo due opzioni:
1 - nel mouse listener invece del repaint() di JFrame [che, per quanto detto sopra, non provoca l'update() del Canvas, perchč AWT] chiami il repaint() del tuo Canvas:

...
public void mouseClicked(MouseEvent e)
{
cont = cont+1;
coox=e.getX();
cooy=e.getY();
cerchio.repaint();
}
...

oppure
2 - Fai estendere alla tua classe Area la classe JPanel [JPanel č Swing] e ridefinisci il metodo paintComponent(Graphics g).
Nel tuo metodo, come prima cosa richiami il paintComponent della classe padre [i dettagli li trovi nell'articolo che ti ho linkato], quindi esegui il tuo rendering:

class Area extends JPanel
{
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (cont>0)
{
g.setColor(Color.black);
g.fillOval(coox+r,cooy+r,r*2,r*2);
}
}
}

DimeCfh91
28-02-2010, 14:16
grazie mille! mi č bastata la prima opzione! Mi č stata molto importante questa esperienza :D adesso devo implementare il vero programma, potete chiudere la discussione!:read: