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

    GridLayout: accedere a celle specifiche

    C'è la possibilità di accedere a specifiche celle per ridisegnarne il contenuto all'interno di un pannello strutturato con un GridLayout?
    Mi spiego meglio: dovrei creare una griglia (ad esempio 3x3) e metterci all'interno delle immagini, poi in seguito ad un evento dovrei far sì che specifiche celle cambiassero l'immagine al suo interno (senza ridisegnare tutto ogni volta). qualcuno ha qualche suggerimento? (grazie in anticipo a tutti coloro che mi scriveranno).
    Allego il codice di esempio che sto scrivendo:

    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;

    public class Frame extends JFrame{
    public Frame(){
    Container panel = getContentPane();
    panel.setLayout(new GridLayout(3,3));
    JLabel img[] = new JLabel[9]; //array di immagini da posizionare nelle celle
    ImageIcon immagine = new ImageIcon("casella_acqua.jpg"); //immagine da posizionare di default
    ImageIcon immagine2 = new ImageIcon("centro_nave.jpg"); //immagine da posizionare in seguito ad un evento
    for(int x = 0; x <= 8 ; x++){
    img[x] = new JLabel(immagine); //inizializzo l'array con l'immagine di default
    panel.add(img[x]); //aggiungo l'immagine al pannello corrispondente
    }
    addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);
    }
    });
    pack();
    setVisible(true);
    }

    public static void main(String args[]){
    Frame fr = new Frame();
    }
    }

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

    Re: GridLayout: accedere a celle specifiche

    Originariamente inviato da ilikeceres
    C'è la possibilità di accedere a specifiche celle per ridisegnarne il contenuto all'interno di un pannello strutturato con un GridLayout?
    Mi spiego meglio: dovrei creare una griglia (ad esempio 3x3) e metterci all'interno delle immagini, poi in seguito ad un evento dovrei far sì che specifiche celle cambiassero l'immagine al suo interno (senza ridisegnare tutto ogni volta). qualcuno ha qualche suggerimento?
    In realtà ti basta semplicemente andare ad agire sul componente nella cella ... ovvero nel tuo caso il JLabel. Semplicemente tieni l'array dei JLabel da qualche parte (variabile di istanza) e poi imposta la nuova immagine sul JLabel!!


    EDIT: consiglio una semplice classe del tipo:

    codice:
    public class IconsGrid extends JPanel {
        private JLabel[][] labels;
    
        public IconsGrid(Icon defaultIcon) {
            labels = new JLabel[3][3];
    
            setLayout(new GridLayout(3, 3));
    
            for (int r = 0; r < 3; r++) {
                for (int c = 0; c < 3; c++) {
                    labels[r][c] = new JLabel(defaultIcon);
    
                    add(labels[r][c]);
                }
            }
        }
        
        public void setIcon(Icon icon, int r, int c) {
            // ....da completare....
        }
    
        // ....altri metodi, se necessari....
    }
    Semplice, pulito e più "astratto".
    Basta poi mettere un oggetto IconsGrid nel content pane del JFrame (parte CENTER con il BorderLayout di default).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie per la risposta tempestiva, io ti scrivo solo ora xche sono appena tornato dalle vacanze. Quello che volevo chiederti è come ridisegnare la griglia, ovvero come implementare la setIcon(), io avevo pensato semplicemente ad una cosa così:

    public void setIcon(Icon icon, int r, int c) {
    labels[r][c] = new JLabel(icon);
    add(labels[r][c]);
    }

    ma ovviamente non funziona come dovrebbe perché aggiunge altre caselle e la griglia cambia dimensione, mentre voglio che la specifica icona nella cella [r][c] venga ridisegnata al posto di quella esistente creata dal costruttore.
    Ti allego anche il main:
    public static void main(String args[]){
    ImageIcon immagine = new ImageIcon("casella_acqua.jpg"); //immagine da posizionare di default
    ImageIcon immagine2 = new ImageIcon("centro_nave.jpg");
    JFrame f = new JFrame("Esercizio griglia");
    Container c = f.getContentPane();
    IconsGrid ig = new IconsGrid(immagine);
    ig.setIcon(immagine2, 2, 2);
    c.add(ig);
    f.pack();
    f.setVisible(true);
    }

    Scusami ma non sono pratico di interfacce grafiche (e soprattutto sono alle prime armi con Java).

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da ilikeceres
    Grazie per la risposta tempestiva, io ti scrivo solo ora xche sono appena tornato dalle vacanze. Quello che volevo chiederti è come ridisegnare la griglia, ovvero come implementare la setIcon(), io avevo pensato semplicemente ad una cosa così:

    public void setIcon(Icon icon, int r, int c) {
    labels[r][c] = new JLabel(icon);
    add(labels[r][c]);
    }
    No affatto .... non serve aggiungere alcun altro nuovo componente!!! Le label ci sono già ... sono state già istanziate, basta solo cambiare la loro proprietà icon.

    codice:
        public void setIcon(Icon icon, int r, int c) {
            labels[r][c].setIcon(icon);
        }
    E se vuoi puoi fare tu un controllo preventivo su r e c che siano in range (e magari lanciare una qualche eccezione più specifica e con descrizione più dettagliata/appropriata) prima che venga lanciato dalla JVM un ArrayIndexOutOfBoundsException.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.