Newsgroup: it.comp.java
Titolo: Disegno

ciao
sto facendo un programmino per disegnare delle semplici figure con il
mouse...
e vorrei come succede in MSpaint quando ho il DraggedMouse disegnare ad
esempio un cerchio in base a quanto si sposta il mouse e ad ogni movimento
aggiornare la figura che ho disegnato,senza perň cancellare quello che avevo
in precedenza in graphics
io uso un bufferedImage per avere la figura sempre aggiornata
perň non riesco ad aggiungere alla mia grafica la grafica del BufferImage
il codice che ho fatto č piů o meno questo
Graphics2D g2=(Graphics2D)g;
Dimension dim=getSize();
bimage= new BufferedImage(dim.width,dim.height,BufferedImage.TYPE_INT_ARGB);
// per renderlo trasparente
AlphaComposite co=AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.5f);
// setto il modo dell alpha e l'alpha
Graphics2D r =bimage.createGraphics();
r.setComposite(co);
r.drawOval(x,y,x1,y1)
g2.drawImage(bimage,0,0,this);
r.clearRect(dim.width,dim.height);
questo č il paint
che richiamo da mouseDragged con repaint();
il problema č che non disegna assolutamente nulla dove sbaglio??????
grazie in anticipo a tutti quelli che risponderanno:)

 grazie in anticipo a tutti quelli che risponderanno:)
(Ho notato che non hai mai settato un colore, magari fai una cosa tipo
r.setColor...) Credo che sia meglio invocare clearRect prima di fare
drawOval. Prova poi a forzare (per verificare) un repaintImmediately()
Andrea

Ciao "Tchijevski Eugenio".
Quello che ti consiglio vivamente di fare per fare il tuo micro Paint è la
seguente cosa:
Giustamente crea un BufferedImage globale, che sarà il tuo vero piano di
disegno.
Nel metodo paintComponent(graphics g), ridisegnerai semplicemente quello.
Tutto il resto lo fai nelle varie procedure.
Perchè questo? semplice. I componenti java, non memorizzano i pixel, quindi
se tu ci disegni sopra, dall'esterno (ad esempio prendendendone il contesto
grafico e poi invocando i metodi di disegno), come la finestra avrà il
bisogno di essere ridisegnata (ad esempio se la iconizzi e poi la rimetti
normale), tutto quello che ci avevi disegnato sparirà.
Questo per tè è anche molto comodo, perchè puoi usare il mouse motion per
prendere la posizione del mouse, disegnare sul pannello e poi invocare il
repaint.
A volte il repaint non fa nulla, perchè scatta solo se sente una reale
modifica grafica del componente, e in oltre tende a ridisegnare solo tale
area. (prova a disegnare su un componente da fuori, invoca il repaint e se
il disegno rimane, prova a spostare la finestra verso l'esterno dello
schermo fino a coprire metà disegno, poi riportale dentro).
Quando senti il mousereleased, disegni il tuo cerchio sul bufferedImage,
così da congelare l'ovale in maniera permanente.
Ricordati di fare come prima istruzione nel tuo paintComponent(...... la
chiamata al metodo della super classe (super.paintComponent(g); )
es.
public class Prova extends Canvas implements .........
// Il canvas è ideale per i disegni-immagini
{
    mouseMontion(.........)
    {
        Graphics2D g2d = (Graphics2D)getGraphics();
        // Siccome so che tanto il repaint() non funzica e che tanto fa la
stessa cose
        // Ridisegni prima il tuo componente, in modo da cancellare i vecchi
cerchi
        g2d.drawImage(bufIm,...............);
        g2d.setColor(Color.blak);
        // La modalità XOR in questo caso è ideale
        // Controlla il colore, non sono sicuro che nero su nero funzichi
        g2d.setXORMode(Color.blak);
        // poi ci disegni sopra il nuovo cechio
        g2d.drawOval(.................);
    }
    mouseReleased(..............
    {
        // Questo per freezare il tuo disegno.
        Graphics2D g2d = bufIm.createGraphics();
        g2d.drawOval(.................);
    }
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.drawImage(bufIm,...............);
    }
}
Spero di non averti confuso ancora di più le idee.......
Ciao.

 wrote in message
acig7v$n10$1...@stargate1.inet.it...


Se sfarfalla, basta ridefinire il metodo public void update(Graphics g),
mettendoci dentro solo la chiamata al paint(g);
Questo metodo è quello che si occupa di cancellare il contenuto del
componente e di richiamare poi il paint per farlo ridisegnare.
Se tu lo ridefinisci e ci metti solo il paint...............
Ciao.