Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56

    Disegnare una griglia di cui le celle siano cliccabili in un JPanel

    Salve
    Sto cercando un metodo per poter disegnare una griglia le cui celle siano cliccabili
    al click di una cella deve verificarsi la colorazione della cella

    sapete aiutarmi?
    c'è qualche libreria o qualcosa di gia scritto che faccia questo?
    se no potete darmi consigli su come realizzare questa cosa?
    grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quello che chiedi va implementato a mano: puoi ridefinire il metodo paintComponent() in una tua classe che estende JPanel per disegnare la griglia e utilizzare un MouseListener per intercettare i clic del mouse. Intercettato il click, puoi ottenere la posizione (coordinate) del clic, quindi capire in quale "cella" ti trovi e colorarla.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Questa è un'alternativa.
    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Griglia extends JPanel {
       private class Cella extends JPanel {
          private boolean colorata;
          private Color bckColore;
          public Cella() {
             setOpaque( true );
             bckColore = getBackground();
             setBorder( BorderFactory.createLineBorder(Color.BLACK, 1) );
          }
          public void switchColore() {
             setBackground(colorata ? bckColore : Color.GREEN);
             colorata = !colorata;
          }
       }
    
       private class Clicker extends MouseAdapter {
          @Override
          public void mouseClicked(MouseEvent me) {
             coloraDecolora((Cella) me.getSource());
          }
       }
    
       private Clicker clicker;
       private Cella[] celle;
       private boolean[] colora;
    
       public Griglia(int rows, int cols) {
          setLayout( new GridLayout(rows, cols) );
          celle = new Cella[rows * cols];
          colora = new boolean[rows * cols];
          clicker = new Clicker();
    
          for(int i=0; i<rows*cols; i++) {
             Cella c = new Cella();
             c.addMouseListener( clicker );
             add( c );
          }
       }
    
       private void coloraDecolora(Cella c) {
          c.switchColore();
       }
    }
    Crea un'istanza di tale classe Griglia (specificando, nel costruttore, il numero di righe e colonne). Posiziona l'istanza in una finestra: verrà creata una griglia. Cliccando all'interno di una cella della griglia, la cella verrà colorata di verde; ri-cliccandoci sopra verrà decolorata.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56
    grazie a tutti per le risposte
    @schumy2000: la jtable l'avevo già adocchiata ma mi sembra più adatta a contenere testo

    @LeleFT: grazie lo spezzone di codiche che hai postato era proprio quello che cercavo, però se io avessi anche la necessità di segnarmi le coordinate della cella cliccata? per poter poi per esempio salvare in un file e ricreare la stessa griglia salvata
    avevo pensato di salvarmi le coordinate x e y in un arraylist, quindi conservare solo quelle cliccate

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da AspxTM
    avevo pensato di salvarmi le coordinate x e y in un arraylist, quindi conservare solo quelle cliccate
    Sì, può andare.
    Il metodo coloraDecolora() lo puoi modificare aggiungendo i parametri che ti servono (come, ad esempio, le coordinate della cella) da salvare nell'ArrayList.

    Potrebbe, a questo punto, essere conveniente modificare la classe interna Cella in modo da ricevere tali indicazioni o anche solo il numero... come vedi, io lascio al LayoutManager (GridLayout) l'onere di posizionare le celle. Per me è un'unica zona continua di X * Y celle.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56
    Originariamente inviato da LeleFT
    Sì, può andare.
    Il metodo coloraDecolora() lo puoi modificare aggiungendo i parametri che ti servono (come, ad esempio, le coordinate della cella) da salvare nell'ArrayList.

    Potrebbe, a questo punto, essere conveniente modificare la classe interna Cella in modo da ricevere tali indicazioni o anche solo il numero... come vedi, io lascio al LayoutManager (GridLayout) l'onere di posizionare le celle. Per me è un'unica zona continua di X * Y celle.


    Ciao.
    sisi ho visto che non sei tu ad assegnare le celle ma è gestito in automatico
    quello che non so è, c'è un metodo forse per ottenere le coordinate della cella dal layout?
    grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56
    ecco come ho modificato il codice
    adesso sembra funzionare a dovere
    sto facendo alcuni test per verificare
    mi manca solo la funziona che riesca a caricare i mattoncini salvati precedentemente
    hai qualche consiglio? credo che comunque mi tocca scorrermi tutta la griglia per poi selezionare solo quelli di cui ho le coordinate segnate

    codice:
     
     public Griglia(int rows, int cols, boolean isEditable) {
            setLayout(new GridLayout(rows, cols));
            celle = new Cella[rows * cols];
            colora = new boolean[rows * cols];
            clicker = new Clicker();
            int r = 0;
            int c = 0;
    
            for (int i = 0; i < rows * cols; i++) {
                if ((i % Names.NUMERO_COLONNE) == 0) {
                    if (i != 0) {
                        r++;
                    }
                    c = 0;
                }
                Cella tmpC = new Cella(r, c);
                if (isEditable) {
                    tmpC.addMouseListener(clicker);
                }
                add(tmpC);
                c++;
            }
    
            mattoncini = new ArrayList();
            try {
                if (flmappe.exists()) {
                    mappe = deserializzaMappe();
                } else {
                    mappe = new HashMap<String, ArrayList<Coordinate>>();
                }
            } catch (IOException ex) {
                Logger.getLogger(Griglia.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Griglia.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
        private class Cella extends JPanel {
    
            private final int riga;
            private final int colonna;
            private boolean colorata;
            private Color bckColore;
    
            public Cella(int row, int col) {
                riga = row;
                colonna = col;
                setOpaque(true);
                bckColore = getBackground();
                setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
            }
    
            public void switchColore() {
                setBackground(colorata ? bckColore : Color.GREEN);
                colorata = !colorata;
            }
    
            public Coordinate restituisciCoordinate() {
                return new Coordinate(colonna, riga);
            }
        }
    
        private void coloraDecolora(Cella c) {
            c.switchColore();
        }
    
        private class Clicker extends MouseAdapter {
    
            @Override
            public void mouseClicked(MouseEvent me) {
                Cella obj = (Cella) me.getSource();
                coloraDecolora(obj);
                Coordinate cord = obj.restituisciCoordinate();
                System.out.println("colonna: " + cord.getX());
                System.out.println("righe: " + cord.getY());
                inserisci_CancellaMattoncino(cord);
            }
        }

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.