Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [JAVA] Rilevare pannello contenitore di JCheckBox

    Ecco il mio problema...

    ....creo dinamicamente un certo numero di JPanel, con l'utilizzo di un JSpinner...
    ....ogni volta che salgo di valore con lo JSpinner viene aggiunto un pannello,
    inversamente quando scendo viene eliminato un pannello partendo dall'ultimo
    inserito. Questi pannelli contengono una checkList composta da n JCheckBox
    passatti al pannello da una classe() apposita che ne controlla il setEnable()
    dei componenti mediante una matrice. Ovvero se nel primo pannello creato
    spunto un JCheckBox la matrice ne registra il valore e nel prossimo pannello
    che creerò quel determinato JCheckBox sarà inversamente abilitato.

    Il problema è però che, se ho per esempio creato due pannelli e vado a spuntare
    un'altra JCheckBox nel primo, dovrei dinamicamente rendere setEnabled(false) quel
    JCheckBox nel secondo pannello!! Ma per far questo, per come sto costruendo il
    codice, ho bisogno di sapere su quale pannello quella determinata JCheckBox riceve
    l'azione.

    Ecco il codice del mio ascoltatore sulle JCheckBox:
    codice:
    // Ascoltatore JCheckButton
    class JCheckButtonListener implements ActionListener {
         public void actionPerformed(ActionEvent e) {
              for (int x=0; x<matrice.length; x++) {
                   if (e.getActionCommand().equals(matrice[x][0])) { matrice[x][1] = "false"; } // disabled
               }
         }
    } // FINE METODO
    Quando creo i pannelli contenitori, li nomino dinamicamente: pannello.setName("nome"+variabile);
    Ma dalla ActionEvent e non riesco ad avere info sul parent
    che contiene la JCheckBox cliccata!!

    Spero di aver spiegato bene il problema,
    se qualcuno può darmi un aiuto..... grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    16
    Guarda non sono un esperto ma in questi ultimi giorni ho avuto a che fare anche io con un bel po' di CheckBox; ho provato a fare qual che tu dici nel mio programma e posso dirti che nell'actionListener del checkbox "stimolato" sono riuscito ad avere qualche informazione:

    se provi con un
    codice:
    System.out.println(e.getSource().getParent().getName());
    ottieni il nome del container, se ne hai assegnato uno, altrimenti osservando un SiaSempreSanto:
    codice:
    System.out.println(e.getSource().toString());
    puoi ottenere alcune info utili.

    Spero di essere stato utile dal basso delle mie miserrime conoscenze

    P.S.: Soluzione poco elegante....
    dichiarando static le cb le puoi governare direttamente indipendentemente dal container, però non è elegante come cosa
    Use the fork() Luke!

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    domanda, non ho provato, ma raggruppare CheckBox "simili" in ButtonGroups?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    anzi, ho provato:
    codice:
    import javax.swing.*;
    import java.awt.*;
    import javax.swing.border.*;
    /**
     *
     * @author Andrea
     */
    public class ButtonGroupsDemo extends JFrame {
        
        private JPanel[] panels = new JPanel[5];
        private JCheckBox[][] manyCheckBox = new JCheckBox[panels.length][3];
        private ButtonGroup[] groups = new ButtonGroup[manyCheckBox[0].length];
        
        private TitledBorder border;
        
        
        
        public void initialize(JPanel panel) {                       
            
            // creiamo i checkbox
            for (int i = 0;  i < manyCheckBox.length; i++) {
                for (int j = 0; j < manyCheckBox[i].length; j++) {
                    manyCheckBox[i][j] = new JCheckBox("Pannello "+(i+1)+", Gruppo-Checkbox "+(j+1));                
                }
            }
            
            // creiamo i buttongroups
            for (int i = 0; i< groups.length; i++) {
                groups[i] = new ButtonGroup();
                
                // raggruppiamo le checkbox
                for (int j = 0; j < manyCheckBox.length; j++) {
                    groups[i].add(manyCheckBox[j][i]);
                }
            }
            
            // creiamo i pannelli
            for (int i = 0; i < panels.length; i++) {
                panels[i] = new JPanel();
                border = BorderFactory.createTitledBorder("Pannello "+(i+1));
                panels[i].setBorder(border);
                // aggiungiamo i checkbox
                for (int j = 0; j < manyCheckBox[i].length; j++) {
                    panels[i].add(manyCheckBox[i][j]);
                }
                
                // aggiungiamo i pannelli al pannnello principale
                panel.add(panels[i]);
            } 
            
        }
        
        public ButtonGroupsDemo() {
            super("Molti pannelli, e ancora più CheckBoxes");
            
            JPanel center = new JPanel(new GridLayout(panels.length,1));
            initialize(center);
            
            this.getContentPane().add(new JScrollPane(center), BorderLayout.CENTER);
            this.setSize(600,600);
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
        public static void main (String[] args) {
            new ButtonGroupsDemo();
        }
        
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Grazie Andrea,
    ho provato velocemente il tuo codice,
    molto funzionante.

    L'importante è poi riuscire a ricavare tutte le info
    sui checkBox, ovvero in quali pannelli sono settati true
    e quali false, cioè ottenere una matrice del tipo:

    matrice[pan1][true][false][true][false]
    matrice[pan2][false][false][false][true]
    matrice[pan3][false][true][false][false]
    matrice[pan4][false][false][false][false]

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    basta poi sull'array di checkbox

    EDIT: aggiunta
    riprendendo l'esempio di prima:
    codice:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.border.*;
    /**
     *
     * @author Andrea
     */
    public class ButtonGroupsDemo extends JFrame {
        
        private JPanel[] panels = new JPanel[5];
        private JCheckBox[][] manyCheckBox = new JCheckBox[panels.length][3];
        private ButtonGroup[] groups = new ButtonGroup[manyCheckBox[0].length];
        
        private TitledBorder border;
        
        private class MySubmitAction implements ActionListener {
            
            JCheckBox[][] manyCheckBox;
            
            public MySubmitAction(JCheckBox[][] manyCheckBox) {
                this.manyCheckBox = manyCheckBox;
            }
            
            public void actionPerformed (ActionEvent ae) {
                for (int i = 0; i < manyCheckBox.length; i++) {
                    for (int j=0; j < manyCheckBox[i].length; j++) {
                        System.out.print(manyCheckBox[i][j].getText()+" : "+manyCheckBox[i][j].isSelected()+"  |  ");
                    }
                    System.out.println("\n______________________________");
                }
            }
        }
        
        
        
        public void initialize(JPanel panel) {                       
            
            // creiamo i checkbox
            for (int i = 0;  i < manyCheckBox.length; i++) {
                for (int j = 0; j < manyCheckBox[i].length; j++) {
                    manyCheckBox[i][j] = new JCheckBox("Pannello "+(i+1)+", Gruppo-Checkbox "+(j+1));                
                }
            }
            
            // creiamo i buttongroups
            for (int i = 0; i< groups.length; i++) {
                groups[i] = new ButtonGroup();
                
                // raggruppiamo le checkbox
                for (int j = 0; j < manyCheckBox.length; j++) {
                    groups[i].add(manyCheckBox[j][i]);
                }
            }
            
            // creiamo i pannelli
            for (int i = 0; i < panels.length; i++) {
                panels[i] = new JPanel();
                border = BorderFactory.createTitledBorder("Pannello "+(i+1));
                panels[i].setBorder(border);
                // aggiungiamo i checkbox
                for (int j = 0; j < manyCheckBox[i].length; j++) {
                    panels[i].add(manyCheckBox[i][j]);
                }
                
                // aggiungiamo i pannelli al pannnello principale
                panel.add(panels[i]);
            } 
            
        }
        
        public ButtonGroupsDemo() {
            super("Molti pannelli, e ancora più CheckBoxes");
            
            JPanel center = new JPanel(new GridLayout(panels.length,1));
            initialize(center);
            
            JButton submitForm = new JButton("SUBMIT");
            submitForm.addActionListener(new MySubmitAction(manyCheckBox));
            
            this.getContentPane().add(new JScrollPane(center), BorderLayout.CENTER);
            this.getContentPane().add(submitForm, BorderLayout.SOUTH);
            this.setSize(600,600);
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
        public static void main (String[] args) {
            new ButtonGroupsDemo();
        }
        
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Grazie mille,
    studierò il tuo codice e ne prenderò spunto

  8. #8
    Ciao Andrea, ecco come ho riadattato il tuo codice alle mie esigenze:
    codice:
    package brogliaccio.giornaliero;
    
    import javax.swing.ButtonGroup;
    import javax.swing.JCheckBox;
    import javax.swing.JPanel;
    
    public class ListaPersonale {
    	
    	private JCheckBox[][] arrayCheck;
    	private ButtonGroup[] groups;
    	private JPanel[] panels;
    
    	private int numeroPersonale;
    	private String[] listaNomi;
    	
    	public ListaPersonale(int numServizio) {		
    		// recupero dati
    		numeroPersonale = GiornalieroPan.gestoreBroglia.getNumPersonale();
    		listaNomi = GiornalieroPan.gestoreBroglia.getLista();
    		
    		arrayCheck = new JCheckBox[numServizio][numeroPersonale];
    		groups = new ButtonGroup[numeroPersonale];
    		panels = new JPanel[numServizio];
    		
    		inizializate();		
    	} // FINE COSTRUTTORE
    	
    	private void inizializate() {
    		// creo i JCheckBox		
    		for (int i = 0;  i < arrayCheck.length; i++) {
                for (int j = 0; j < arrayCheck[i].length; j++) {
                    arrayCheck[i][j] = new JCheckBox(listaNomi[j]);
                    arrayCheck[i][j].setOpaque(false);                
                    // se NON è in stato di SERVizio non può essere selezionato NB: valori in matrice[x][4]
                    if (!GiornalieroPan.gestoreBroglia.matrice[j][4].equals("SERV")) { arrayCheck[i][j].setEnabled(false); }
                }
            }		
    		
    		// creo i buttongroups		
            for (int i = 0; i< groups.length; i++) {
                groups[i] = new ButtonGroup();
                
                // raggruppo le checkbox
                for (int j = 0; j < arrayCheck.length; j++) {
                    groups[i].add(arrayCheck[j][i]);
                }
            }
            
            // creo i pannelli        
            for (int i = 0; i < panels.length; i++) {
                panels[i] = new JPanel();
                panels[i].setPreferredSize(GiornalieroPan.dimsBroglia.getPanels(numeroPersonale));
                panels[i].setOpaque(false);
                
                // aggiungo i checkbox
                for (int j = 0; j < arrayCheck[i].length; j++) {
                    panels[i].add(arrayCheck[i][j]);
                }
            }
    	} // FINE METODO
    	
    	public JPanel drawList(int numServizio) {
    		// aggiungo i pannelli al pannnello principale su richiesta
    		return panels[numServizio-1];
    	} // FINE METODO
    	
    } // FINE CLASSE
    Grazie infinite

    PS: una domanda.... ho visto che nella Classe metti per ultimo il costruttore, per prima la private class MySubmitAction (che io per il momento ho saltato) e poi i metodi. Ha rilevanza l'ordine con cui vengono impostate nella Classe()? Grazie.

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    non mi risulta che vi sia alcuna rilevanza nell'ordine di dichiarazione di fields e metodi in java.

    La "regola", personale e mnemonica, che applico nella scrittura del (mio) codice è:

    -fields di classe subito dopo la dichiarazione della classe stessa (perché insieme ad eventuale extends e agli implements aiutano a capire subito che cosa ci sia nella classe),

    - eventuali classi private;

    - metodi: dichiarati prima di dove vengano utilizzati;

    - costruttore/i in fondo, con quello con più parametri in alto e quelli meno specializzati in basso.

    Se è presente un main, è l'ultimo metodo che scrivo prima della chiusura della classe.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  10. #10
    Ok grazie.... gentilissimo

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.