Visualizzazione dei risultati da 1 a 7 su 7

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da ericdraven92 Visualizza il messaggio
    Di seguito un link YouTube di un Game Of Life. Vai al minuto 02:14 https://m.youtube.com/watch?v=CgOcEZinQ2I

    ogni cella, graficamente, deve solo essere un colore (bianco o nero a seconda di cosa gli viene passato).

    ho 2025 oggetti di tipo Cellula (ovviamente classe creata da me), ognuno del quale ha uno stato (0 o 1).
    Ok, ho visto la griglia, mi è chiaro il risultato aspettato. Tecnicamente parlando, ci sono almeno 3 soluzioni in Swing:

    a) Disporre le 45x45 celle usando un layout manager, GridLayout è il candidato ideale. Ogni cella chiaramente dovrà contenere un componente, potrebbe essere un JLabel o un JPanel, cambia poco, l'importante che è sia "opaco" e si possa settarne quindi il background. O addirittura si potrebbe definire un componente custom. Quale componente usare comunque è meno importante del resto.
    Bisogna anche considerare le dimensioni: GridLayout suddivide l'intero contenitore (il componente che ha il GridLayout) in NxM celle, quindi se fissi la dimensione del contenitore (es. perché dipende direttamente dalla dimensione del frame), sono le celle ad adattarsi, non il contrario. Altrimenti puoi fare in modo che sia il contenitore ad adattarsi ai componenti nelle celle, che devono avere un "preferred size".

    b) Disporre le 45x45 celle senza un layout manager. Usi la tecnica del posizionamento "assoluto", ogni componente lo disponi dove vuoi e con la dimensione che vuoi (setLocation+setSize oppure setBounds). La scelta del componente da usare per le celle è uguale/similare a quanto detto in a).

    c) Usi il custom painting, ovvero definisci un componente custom (estendendo JPanel o al limite JComponent) in cui disegni tutta la griglia tramite la API di Java 2D. Chiaramente va tutto gestito, painting corretto, metodi per settare lo stato delle celle, ecc..
    Visto che è un griglia molto regolare e semplice, non è troppo difficile (ma richiede comunque buone conoscenze sul painting, Java 2D, ecc...)

    A te la scelta.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #2
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ok, ho visto la griglia, mi è chiaro il risultato aspettato. Tecnicamente parlando, ci sono almeno 3 soluzioni in Swing:

    a) Disporre le 45x45 celle usando un layout manager, GridLayout è il candidato ideale. Ogni cella chiaramente dovrà contenere un componente, potrebbe essere un JLabel o un JPanel, cambia poco, l'importante che è sia "opaco" e si possa settarne quindi il background. O addirittura si potrebbe definire un componente custom. Quale componente usare comunque è meno importante del resto.
    Bisogna anche considerare le dimensioni: GridLayout suddivide l'intero contenitore (il componente che ha il GridLayout) in NxM celle, quindi se fissi la dimensione del contenitore (es. perché dipende direttamente dalla dimensione del frame), sono le celle ad adattarsi, non il contrario. Altrimenti puoi fare in modo che sia il contenitore ad adattarsi ai componenti nelle celle, che devono avere un "preferred size".

    b) Disporre le 45x45 celle senza un layout manager. Usi la tecnica del posizionamento "assoluto", ogni componente lo disponi dove vuoi e con la dimensione che vuoi (setLocation+setSize oppure setBounds). La scelta del componente da usare per le celle è uguale/similare a quanto detto in a).

    c) Usi il custom painting, ovvero definisci un componente custom (estendendo JPanel o al limite JComponent) in cui disegni tutta la griglia tramite la API di Java 2D. Chiaramente va tutto gestito, painting corretto, metodi per settare lo stato delle celle, ecc..
    Visto che è un griglia molto regolare e semplice, non è troppo difficile (ma richiede comunque buone conoscenze sul painting, Java 2D, ecc...)

    A te la scelta.
    L'ipotesi C credo sia per me la più difficile perché non ho alcuna esperienza sul Painting, posso però provare a documentarmi su Oracle.
    L'ipotesi a) l'avevo presa in considerazione ma non posso avere una matrice sparsa, è tra i requisiti del progetto, quindi se avessi tutte e 2025 cellule avrei una serie di 0 e pochi 1 almeno in fase iniziale. Per evitare questa cosa uso l'HashMap.. Io vorrei estrarre solo quelli in mappa (che magari possono essere 3 in un dato momento). Esiste un modo, se ad esempio dispongo 2025 Label con il GridLayout, di modificare la i-esima Label? Dovrei fare per forza un array di Label oppure posso accedere a [3,9] sfruttando il grid?

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da ericdraven92 Visualizza il messaggio
    L'ipotesi a) l'avevo presa in considerazione ma non posso avere una matrice sparsa, è tra i requisiti del progetto, quindi se avessi tutte e 2025 cellule avrei una serie di 0 e pochi 1 almeno in fase iniziale. Per evitare questa cosa uso l'HashMap.. Io vorrei estrarre solo quelli in mappa (che magari possono essere 3 in un dato momento).
    Ok ma non confondere la struttura logica con quella fisica/visuale. Se vuoi gestire a livello logico un array "sparso", puoi farlo appunto con una mappa (ti consiglierei ad esempio di fare una classe apposita es. ArraySparso che incapsula questa logica). Ma questo non è detto che c'entri direttamente qualcosa con il modo di presentare visivamente quei dati!

    Se usi GridLayout devi inserire componenti in tutte le celle, non puoi lasciare "buchi". Ricorda che nei "container" (qualunque cosa che è o estende java.awt.Container) i componenti contenuti sono in una banale lista e ci pensa il layout manager a disporli secondo le sue logiche. Ma per il l.m. quello è solo un elenco di componenti, infatti GridLayout lo puoi creare per NxM celle ma poi lui dispone i componenti come se fossero un flusso che va da sinistra-destra (o il contrario) e alto-basso. Ecco perché non puoi avere buchi.

    Quote Originariamente inviata da ericdraven92 Visualizza il messaggio
    Esiste un modo, se ad esempio dispongo 2025 Label con il GridLayout, di modificare la i-esima Label? Dovrei fare per forza un array di Label oppure posso accedere a [3,9] sfruttando il grid?
    GridLayout non fornisce alcunché per "vedere" a livello logico una griglia. Insomma, non ha un metodo del tipo "dammi il componente alla riga y, colonna x". Proprio per i motivi detti prima.

    Questo però non vuol dire nulla (di grave). Vuol solo dire che devi tenerti tu un array bidimensionale dei componenti per poter fare quell'accesso diretto ad un componente alla cella x,y.

    codice:
    public class FrameGioco extends JFrame {
        private JPanel contenitoreGriglia;
        private GridLayout gridLayout;
        private JLabel[][] matriceLabel;
    .......
    }

    Quindi mentre fai il doppio ciclo for per riempire matriceLabel, li aggiungi anche al contenitoreGriglia. Tutto qui. Non vedere/creare problemi dove in effetti non ce ne sono.
    Ultima modifica di andbin; 11-04-2016 a 09:52
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Ti voglio bene!

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.