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

    Problema JCheckbox: risultano sempre false

    Ciao ragazzi!
    Vi riscrivo perchè h un problema stupido e non riesco ad uscirene. Il codice della mia applicazione per la visualizzazione di coppie di immagini e scelta di una tra le varie coppie è tanto. L'unico problema è che ogni volta che durante l'esecuzione spunto una checkbox, il suo valore è sempre false. Ho fatto dei test per verificarlo(stampando un array contenente il valre isSelected() di ogni checkbox).Mi spiego con qualche linea di codice. Tutto il programma va bene,ed è come mi aspettavo ma ho solo un problemino con le checkbox. Ho semplificato il codice ma in sostanza è questo:

    classe myFrame che dopo aver visualizzato un frame crea un oggetto di tipo screen...
    codice:
    Screen schermo = new Screen(timeOfImage,timeOfChoice,numOfImages, timeBeforeChoice, timeBetwImage);
    di seguito la classe screen..

    codice:
    public class Screen extends JFrame implements ActionListener {
    
        private int timeOfImage;
        private int timeOfChoice;
        private int numOfImages;
        private int timeBetwImage;
        private int timeBeforeChoice;
        private JPanel contentPane;
        private final int MILLE = 1000;
        private JLabel label;
        public int index;
        private Timer timerDisplay;
        private Timer timerBetweenImages;
        private Timer timerBeforeChoice;
        public PrintStream output;
        private int scelta;
        private int i;
        public ImageIcon[] image = new ImageIcon[8];
        private Timer timerChoice;
        private int number;
    
        {
            image[0] = new ImageIcon(getClass().getResource("/Copia di album/1.jpg"));
            image[1] = new ImageIcon(getClass().getResource("/Copia di album/2.jpg"));
            image[2] = new ImageIcon(getClass().getResource("/Copia di album/3.jpg"));
            image[3] = new ImageIcon(getClass().getResource("/Copia di album/4.jpg"));
            image[4] = new ImageIcon(getClass().getResource("/Copia di album/5.jpg"));
            image[5] = new ImageIcon(getClass().getResource("/Copia di album/6.jpg"));
            image[6] = new ImageIcon(getClass().getResource("/Copia di album/7.jpg"));
            image[7] = new ImageIcon(getClass().getResource("/Copia di album/8.jpg"));
        }
    
        public Screen(int timeOfImage, int timeOfChoice, int numOfImages, int timeBeforeChoice, int timeBetwImage) throws FileNotFoundException {
    // variabili inserite in un form dall'utente
            this.timeOfImage = timeOfImage;
            this.timeOfChoice = timeOfChoice;
            this.numOfImages = numOfImages;
            this.timeBeforeChoice = timeBeforeChoice;
            this.timeBetwImage = timeBetwImage;
            number = numOfImages;
            setUndecorated(true);
            setBackground(Color.BLACK);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            contentPane = new JPanel();
            contentPane.setBackground(Color.BLACK);
            setContentPane(contentPane);
            contentPane.setLayout(new GridLayout(1, 1));
    //posiziono label al centro per visualizzare singola immagine e lo aggiungo
            label = new JLabel("", SwingConstants.CENTER);
            contentPane.add(label);
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            setBounds(0, 0, screenSize.width, screenSize.height);
    //creo timer per il tempo di visualizzazione di ogni singola immagine
            timerDisplay = new Timer(this.timeOfImage * MILLE, this);
            timerDisplay.setRepeats(false);
            timerDisplay.setActionCommand("blackScreen");
    //timer tra le immagini
            timerBetweenImages = new Timer(this.timeBetwImage * MILLE, this);
            timerBetweenImages.setRepeats(false);
            timerBetweenImages.setActionCommand("image");
    //timer prima della scelta
            timerBeforeChoice = new Timer(this.timeBeforeChoice * MILLE, this);
            timerBeforeChoice.setRepeats(false);
            timerBeforeChoice.setActionCommand("Choice");
    //tempo di scelta
            timerChoice = new Timer(this.timeOfChoice * MILLE, this);
            timerChoice.setRepeats(false);
            timerChoice.setActionCommand("End");
    //creo file csv per i risultati
            FileOutputStream file = new FileOutputStream("output.csv");
            output = new PrintStream(file);
            output.println("Time;User;ShortExcitement;LongExcitement;Engagement;Image");
    //faccio partire il primo timer
            timerDisplay.start();
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
    // tempo tra immagini consecutive
            if (e.getActionCommand().equals("blackScreen")) {
                label.setIcon(null);
                if (index != numOfImages) {
                    timerBetweenImages.start();
                } else {
    //se sono finite le immagini allora faccio passare tempo prima della loro scelta
                    label.setIcon(null);
                    timerBeforeChoice.start();
                }
    //mostro le singole immagini
            } else if (index < numOfImages && e.getActionCommand().equals("image")) {
                label.setIcon(image[index]);
                index++;
                timerDisplay.start();
                output.println();
            } else if (e.getActionCommand().equals("Choice")) {
                contentPane.remove(label);
    //modifico il layout per inserire tanti pannelli quanto sono le immagini
                contentPane.setLayout(new GridLayout(1, this.numOfImages));
                repaint();
                validate();
                boolean[] o = new boolean[numOfImages];
    //creo pannello
                JPanel panel1 = new JPanel();
                panel1.setBackground(Color.BLACK);
                panel1.setLayout(new GridLayout(2, 1));
    //aggiungo immagine e checkbox al pannello
                JLabel lblNewLabel_1 = new JLabel("");
                lblNewLabel_1.setBackground(Color.BLACK);
                lblNewLabel_1.setHorizontalAlignment(SwingConstants.CENTER);
                lblNewLabel_1.setIcon(image[i]);
                panel1.add(lblNewLabel_1);
                JCheckBox chckbxNewCheckBox = new JCheckBox("Immagine " + (i + 1));
                chckbxNewCheckBox.setBackground(Color.BLACK);
                chckbxNewCheckBox.setForeground(Color.WHITE);
                chckbxNewCheckBox.setHorizontalAlignment(SwingConstants.CENTER);
                chckbxNewCheckBox.setFont(new Font("Tahoma", Font.BOLD, 14));
                panel1.add(chckbxNewCheckBox);
                contentPane.add(panel1);
    //creo pannello
                JPanel panel2 = new JPanel();
                panel2.setBackground(Color.BLACK);
                panel2.setLayout(new GridLayout(2, 1));
    //aggiungo immagine e checkbox al pannello
                JLabel lblNewLabel_2 = new JLabel("");
                lblNewLabel_2.setBackground(Color.BLACK);
                lblNewLabel_2.setHorizontalAlignment(SwingConstants.CENTER);
                lblNewLabel_2.setIcon(image[i + 1]);
                panel2.add(lblNewLabel_2);
                JCheckBox chckbxNewCheckBox2 = new JCheckBox("Immagine " + (i + 2));
                chckbxNewCheckBox2.setBackground(Color.BLACK);
                chckbxNewCheckBox2.setForeground(Color.WHITE);
                chckbxNewCheckBox2.setHorizontalAlignment(SwingConstants.CENTER);
                chckbxNewCheckBox2.setFont(new Font("Tahoma", Font.BOLD, 14));
                panel2.add(chckbxNewCheckBox2);
                i++;
    //aggiungo pannello al contentPane
                contentPane.add(panel2);
                repaint();
                validate();
                timerChoice.start();
                o[0] = chckbxNewCheckBox.isSelected();
                o[1] = chckbxNewCheckBox.isSelected();
                output.println(scelta);
    ///PROBLEMAAAAAAAAAAAA sempre false anche se possono essere selezionate
                for (int j = 0; j <= 1; j++) {
                    if (o[j]) {
                        scelta = j;
                    }
                    System.out.println(o[j]);
                }
            } else if (e.getActionCommand().equals("End")) {
                contentPane.removeAll();
                repaint();
                validate();
                index = this.numOfImages;
    //System.out.println(index);
                this.numOfImages = this.numOfImages + number;
    //System.out.println(numOfImages);
                contentPane.setLayout(new GridLayout(1, 1));
                contentPane.add(label);
                if (numOfImages <= image.length) {
                    timerDisplay.start();
                } else {
                    dispose();
                }
            }
        }
    }
    codice:
    
    ///PROBLEMAAAAAAAAAAAA sempre false anche se possono essere selezionate
    for (int j = 0; j <=1;j++){
       if(o[j]) scelta = j;
       System.out.println(o[j]);
    
    INSOMMA è sempre false.vorrei sapere se il problema sta:
    1-nei timer
    2-nel dover associare un actionlistener alle checkbox

    Purtroppo sono poco ferrat su questi due concetti quindi vorrei capire secondo voi in quale direzione dovrei spingermi.
    grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Quando posti del codice più lungo di una riga, NON usare il pulsante CODE dell'editor, ma scrivi i tag manualmente nel corpo messaggio in questo modo:

    [CODE]
    Poi incolli il codice, formattato
    [/CODE]

    Altrimenti il codice viene formattato su una riga sola e diventa praticamente illeggibile.
    Ho corretto il tuo post.

    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
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    boh a me sembra che ci sia qualcosa di pensato male. Correggimi se sbaglio: tu crei le checkbox ogni volta all'interno di actionPerformed. Adesso, la checkbox è di default creata non selezionata. Se dopo la creazione ne prendi il valore dello stato con isSelected ovviamente troverai sempre e comunque falso. In altre parole, la creazione della checkbox deve avvenire da qualche altra parte, ovvero devi rivedere un attimo che cosa finisce dentro quell'actionPerformed e cosa no...
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    si appunto.actionperformed mi serve per la gestione dei timer.Secondo te dovedovrei inserire la creazione delle checkbox in modo che,quando vengono visualizzate le immagini, l'utente le spunta e il loro valore cambia?

  5. #5
    cioè come visualizzare il loro cambiamento di stato?quando il programma viene eseguito,l'utente può spuntarle,ma come si può capire a runtime se l'utente le ha selezionate o meno?il programma funziona come vorrei(le immagini vengono visualizzate e le checkbox create) ma se vengono spuntate il cambiamento del loro stato non risulta.

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ma in pratica che cosa vorresti fare?
    Mostri 2 immagini, parte un timer, l'utente ha un certo tempo per fare una scelta, alla fine del tempo prestabilito si chiude il pannello ed eventualmente vengono mostrate altre immagini per ricominciare il processo?

    Se fosse qualcosa del genere, il valore delle checkbox lo devi raccogliere allo scadere del tempo e non subito dopo la creazione delle stesse
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Esattamente.Mostro la prima immagine,poi la seconda ed infine entrambe le immagini contemporaneamente tra cui l'utente deve scegliere.La scelta avviene in un certo tempo.appena la checkbox è spuntata(cioè l'utente ha fatto la sua scelta).il numero dell'immagine scelta viene salvata o stampato da qualche parte(ho pensato di usare lo stato(spuntat o meno) di ciascuna checkbox per capire quale scelta è stata effettuata.tutto questo si ripete fino a quando non sono finite le immagini.le visualizzazioni delle immagini sono intervallate. i diversi timer riguardan sia il temp di visualizzazione delle singole immagini,delle immagini in contemporanea per la scelta e anche i tempi di schermo nero(dai commenti si dovrebbe capire).graficamente va tutto bene e come ci si aspetta ma non capisc dove devo inserire il controllo isSelected() per ogni checkbox

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Allora secondo me dovresti usare radiobutton piuttosto che checkbox e raggrupparli in buttongroup e poi dovresti utilizzare gli eventi su tali bottoni per registrare lo stato e non chiamare direttamente isSelected (che semmai dovrebbe essere un controllo a posteriori).
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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.