Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Il MIO gioco della vita, in java! Problemi con l'interfaccia grafica

    Ciao a tutti. Mi presento qui innanzitutto perchè non ho trovato la pagina di presentazione. Mi chiamo Stefano e sono uno studente universatario!

    Per un progetto (universitario, ndr) mi è stato chiesto di implementare il gioco della vita di Conway.

    Ho scritto il "MIO gioco della vita" perchè ho cambiato un paio di "regole" a questo gioco per l'evoluzione delle cellule. Non sto qui a scrivere tutte le condizioni perchè non sono rilevanti ai fini della richiesta.
    Il problema ce l'ho con l'interfaccia grafica. Nello specifico io ho un main in cui svolto i vari controlli, le varie operazioni ecc.
    Ho un'hashmap in cui ho memorizzato le sole cellule che devono essere visualizzate, ovvero quelle vive. Ognuna di queste cellula ha un attributo indicante la riga e la colonna.
    L'idea è questa: di partenza la finestra è nera. Estraggo gli elementi dalla mappa e di ogni elemento prendo la riga e la colonna. L'elemento alla posizione (riga,colonna) lo coloro di bianco.

    Ho provato a crare una jtable, ho provato a dare un gridlayout(45,45) ma con risultati pessimi. Nello specifico, io vorrei accedere direttamente ad una posizione [riga][colonna] e settare il colore.
    Ho provato anche a creare un frame, aggiungere 2025 (45x45) JLabel ma, anche in questo caso, il risultato è stato pessimo in quanto non riesco ad accedere alla 72 (ad esempio) JLabel.
    Le JLabel le avevo inserite così for (....) finestra.add(new JLabel());

    Potreste darmi un consiglio su cosa utilizzare e/o
    come gestire la cosa?

  2. #2
    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'idea è questa: di partenza la finestra è nera. Estraggo gli elementi dalla mappa e di ogni elemento prendo la riga e la colonna. L'elemento alla posizione (riga,colonna) lo coloro di bianco.

    Ho provato a crare una jtable, ho provato a dare un gridlayout(45,45) ma con risultati pessimi. Nello specifico, io vorrei accedere direttamente ad una posizione [riga][colonna] e settare il colore.
    Ho provato anche a creare un frame, aggiungere 2025 (45x45) JLabel ma, anche in questo caso, il risultato è stato pessimo in quanto non riesco ad accedere alla 72 (ad esempio) JLabel.
    Le JLabel le avevo inserite così for (....) finestra.add(new JLabel());

    Potreste darmi un consiglio su cosa utilizzare e/o
    come gestire la cosa?
    Non conosco il gioco ma ... detto così è un po' vago. Cosa devono contenere le celle a livello grafico? Devi impostarle una volta sola o continuamente? Devono rispondere ad eventi (es. del mouse)? Cosa ti aspetti quindi dalla interfaccia grafica (puoi postare una immagine abbozzata)? Ma soprattutto quanto sai di Swing?
    Nota: c'è il tutorial Oracle ufficiale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Non conosco il gioco ma ... detto così è un po' vago. Cosa devono contenere le celle a livello grafico? Devi impostarle una volta sola o continuamente? Devono rispondere ad eventi (es. del mouse)? Cosa ti aspetti quindi dalla interfaccia grafica (puoi postare una immagine abbozzata)? Ma soprattutto quanto sai di Swing?
    Nota: c'è il tutorial Oracle ufficiale.
    Su Swing non so quantificare la mia conoscenza ma non è bassa (parlo sempre rispetto al livello medio universitario, quindi senza scendere nel dettaglio specifico di ogni componente esistente). 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).
    ho un HashMap in cui sono inseriti esclusivamente gli oggetti di stato 1 ed il mio obiettivo stampare a video il colore bianco in corrispondenza di una cellula viva. Ogni cellula ha un attributo riga ed uno colonna, quindi l'idea è di estrarre le cellule dalla mappa ( ad esempio cellula 8, cellula 2024, cellula 1).
    la cellula 8 ha riga=1 e colonna=7, quindi alla posizione (1,7) di un'ipotetica matrice deve esserci un tassello bianco, stessa cosa per le altre cellule presenti.
    nella classe per gestire l'interfaccia grafica creerò un metodo aggiorna(HashMap miamappa) che estrarrà le cellule ed aggiornate i tasselli corrispondenti. Richiamerò questo metodo ogni volta che ne ho necessità nel main.
    Il mouse serve solo a stoppare la visualizzazione, che è continua in quanto le cellule si diffondo autonomamente fino a riempire tutta la griglia/matrice di 45x45, ma so come implementare gli eventi, mi manca solo di capire come cavolo gestire questa grafica di cellule che si estendono

  4. #4
    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

  5. #5
    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?

  6. #6
    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

  7. #7
    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.