Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Problema con painting

  1. #1
    Utente di HTML.it L'avatar di shane007
    Registrato dal
    Jun 2011
    residenza
    Trentino, tra vacche ed aria buona.
    Messaggi
    55

    Problema con painting

    Ciao a tutti, sono alle prese con un problema che credo sia abbastanza banale, ma che non riesco a risolvere :
    Devo fare un esercizio che vi riassumo:

    Dividere un JPanel in 4 parti uguali con delle linee (drawLine)
    Fare in modo che quando clicco in uno dei quadrati (quelli creati attraverso le line) questo cambi colore in modo casuale.
    Il pannello con una cella che è stata cliccata:



    fin qui tutto ok, ma ho un problema: vorrei che quando clicco per esempio sul quadrato in alto a destra e poi su quello in basso a sinistra quello cliccato precedentemente resti comunque colorato.
    Questo è quello che ho scritto fino adesso:
    Codice PHP:
    import java.awt.*;
    import java.awt.event.*;
    import java.util.Random;
    import javax.swing.*;

    /**
     *
     * @author Davide
     */
    public class MyPanel extends JPanel implements MouseListener {
        private 
    JPanel pannello=new JPanel();
        
    int fx,fy,x=0,y=0;
         
    Random random = new Random(System.currentTimeMillis());
        
    Color colore;
        
    int cont=0;
        public 
    MyPanel(){
            
    this.setBackground(Color.WHITE);
            
    this.addMouseListener(this);
            
           
        }
        
        public 
    void paintComponent(Graphics g){
            
    super.paintComponent(g);
            
    colore = new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
            
    fy=this.getSize().height;
            
    fx=this.getSize().width;
            
    //colorazione in base al click
            
    g.setColor(colore);
            if(
    x<=fx/2  && y<=fy/&& x>0)//alto sx  (x>0 perchè altrimienti parte direttamente colorato perchè x=0)
                
    g.fillRect(00fx/2fy/2);
            if(
    x<=fx/&& y>=fy/2)//basso sx
                
    g.fillRect(0fy/2fx/2fy/2);
            if(
    x>=fx/&& y<=fy/2//alto dx
                
    g.fillRect(fx/20fxfy/2);
            if(
    x>=fx/&& y>=fy/2//basso dx
                
    g.fillRect(fx/2fy/2fxfy);
            
            
            
    g.setColor(Color.black);
            
    g.drawLine(fx/20fx/2fy);
            
    g.drawLine(0,fy/2fxfy/2);
        }

        @
    Override
        
    public void mouseClicked(MouseEvent me) {
            
    x=me.getX();
            
    y=me.getY();
            
    repaint();
        }

        @
    Override
        
    public void mousePressed(MouseEvent me) {}

        @
    Override
        
    public void mouseReleased(MouseEvent me) {}

        @
    Override
        
    public void mouseEntered(MouseEvent me) {}

        @
    Override
        
    public void mouseExited(MouseEvent me) { }

    credo il problema sta nel fatto che quando chiamo la repaint() a seguito di un click questa ri-esegue (ovviamente) anche super.paintComponent(g); che ovviamente non posso togliere...

    PS: se volete provare a compilare voi stessi vi allego il progetto dove c'è anche il main (ci sono altre cose che devo ancora implementare, ma non danno fastidio )
    progetto:
    https://www.dropbox.com/s/bfp0e25liy...e_2-gen-09.zip

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

    Re: Problema con painting

    Originariamente inviato da shane007
    vorrei che quando clicco per esempio sul quadrato in alto a destra e poi su quello in basso a sinistra quello cliccato precedentemente resti comunque colorato.
    Allora nel tuo MyPanel devi tenere 4 variabili di istanza per ciascun colore/area. Non è questo che stai facendo nel tuo codice attuale.

    Inoltre la creazione di un colore random non deve essere (nel tuo caso) in paintComponent. Perché paintComponent può essere invocato dal framework mille-mila volte, anche per un banale resize della finestra che contiene il pannello, ad esempio.

    Nel mouseClicked:
    a) dal point deduci quale area si tratta delle quattro.
    b) crei il colore random e lo assegni alla variabile di istanza Color relativa.
    c) chiedi repaint (se vuoi anche in modo "furbo", non di tutto ma solo di quella area ... ma è un aspetto di ottimizzazione, più avanzato che magari non ti interessa, sappi che si può).

    Nel paintComponent semplicemente (oltre a super.paintComponent):
    a) per ciascuna area: setColor e fillRect
    b) drawLine degli assi.
    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 L'avatar di shane007
    Registrato dal
    Jun 2011
    residenza
    Trentino, tra vacche ed aria buona.
    Messaggi
    55
    Sono un povero illuso! Pensavo ci fosse già fatto qualcosa "abstract" e bastasse implementarlo!

    A parte questo, ho un altro problema con un altro esercizio, ma è simile a questo:

    Da una combo box devo selezionare una figura tra cerchio, quadrato, e triangolo e poi devo disegnarla nel punto cliccato dal mouse.
    Se clicco il mouse in 2 o più punti diversi devo disegnare 2 o più figure (ovviamente).

    In questo caso come posso fare visto che ho un numero di figure ignoto?
    Mi devo fare una Collection?

    Intanto grazie 1000 andbin!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da shane007
    In questo caso come posso fare visto che ho un numero di figure ignoto?
    Mi devo fare una Collection?
    Sì, un semplice (Array)List<Qualcosa> è sufficiente.

    Dove quel Qualcosa sarebbe preferibile/buono che fosse un tipo "base" (es. Figura) da cui derivano le classi concrete per le varie figure possibili. E ognuna potrebbe avere/implementare un disegna(Graphics g) in modo che il concetto di disegno specifico sia implementato nella sua classe .... non nel paintComponent di quel tuo pannello di disegno.

    Chiaramente al click, aggiungi nella lista e chiedi repaint. paintComponent scansiona la lista e invoca i disegna sulle figure. Questa è la soluzione base senza alcuna "ottimizzazione".
    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 L'avatar di shane007
    Registrato dal
    Jun 2011
    residenza
    Trentino, tra vacche ed aria buona.
    Messaggi
    55
    Domani, quando lo farò, ci sarà da ridere!
    Preparati a qualche domanda

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.