Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Evento su Choice awt

  1. #1

    Evento su Choice awt

    Salve, sto cercando un modo per associare un listener a un menù a tendina di Java (Choice) come si fa in JavaScript con i select, senza passare per un Button. Esiste un metodo Java equivalente all'onchange di JavaScript per i select HTML?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Salve, sto cercando un modo per associare un listener a un menù a tendina di Java (Choice) come si fa in JavaScript con i select, senza passare per un Button. Esiste un metodo Java equivalente all'onchange di JavaScript per i select HTML?
    Il Choice di AWT definisce un solo listener più specifico che è ItemListener. Gli altri listener più generici e di più "basso" livello (es. KeyListener, MouseListener ecc...) li "eredita" dal java.awt.Component.

    L'equivalente del onchange citato sui <select> HTML, nel Choice è proprio il ItemListener, quindi ti basta registrarlo ed usarlo così, es.:
    codice:
    tuoChoice.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
                System.out.printf("Hai selezionato %s all'indice %d%n",
                        tuoChoice.getSelectedItem(), tuoChoice.getSelectedIndex());
            }
        }
    });


    P.S. ItemListener ha un solo metodo quindi, volendo, anche con una lambda expression (Java 8+).
    Ultima modifica di andbin; 14-05-2022 a 23:46
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

  4. #4
    Qualcosa non funziona. Col button il programma restava in attesa dell'evento click, mentre col choice continua, l'unico effetto che ottengo è la stampa della scelta ma intanto gli output automatici sono già iniziati.
    codice:
    menu.setEnabled(true); // menu è il mio Choice che partiva disattivato
    		
    menu.addItemListener(new ItemListener() {
    			
    	@Override
    	public void itemStateChanged(ItemEvent e) {
    				
    		if (e.getStateChange() == ItemEvent.SELECTED) {
    			tuaScelta = menu.getSelectedIndex()-1;
    			menu.setEnabled(false);
    			scrivi.append("Quarto di finale: ");
    			avvers1 = 7 - tuaScelta;		
    			scrivi.append(SquadreNomi[tuaScelta] + "-" + SquadreNomi[avvers1] + "\n");
    		}
    				
    	}
    });
    Il programma esegue le istruzioni seguenti ma appunto non considera la squadra selezionata, a parte scrivermela nella JTextArea scrivi.
    Ho provato a riprodurre la situazione che avevo con il button, cioè inserendo le istruzioni nel listener, ottenendo un
    Exception in thread "main" java.lang.NoClassDefFoundError
    su una classe definita nel caller, che è perfettamente scritta e implementata dato che lasciando le istruzioni successive fuori dal listener funziona.
    Ho anche provato a spostare le istruzioni successive nell'if del listener, e Java mi lancia
    unreported exception InterruptedException; must be caught or declared to be thrown
    ma se aggiungo il relativo throws dichiarando il metodo, mi dice che non posso implementarlo in quel metodo.

  5. #5
    L'exception l'ho risolta dichiarando l'istanza "incriminata" fuori metodo e creandola nel metodo caller di quello in questione.
    Però, dato che tengo il Choice disabled finché nella JTextArea non sono apparse le "istruzioni", quando lo abilito, il listener vede l'evento e, per come sono impostati i parametri, termina l'applicazione dicendo che la mia squadra ha perso contro sé stessa.

  6. #6
    Ho ripristinato l'evento sul JButton, ma non funzionano molte cose...
    codice:
    bottone.addActionListener(new ActionListener() {    
                
        public void actionPerformed(ActionEvent e) {         
                    
            try {
                tuaScelta = menu.getSelectedIndex();
                avvers1 = 7 - tuaScelta;
                scrivi.append(SquadreNomi[tuaScelta] + "-" + SquadreNomi[avvers1] + "\n"); // 1
                scrivi.setCaretPosition(scrivi.getDocument().getLength());
                menu.setEnabled(false);
                quarto = new Match(Squadre.get(tuaScelta), Squadre.get(avvers1));
                esito1 = giocaQuarto(scrivi); // 2
                bottone.setEnabled(false);
            } catch (InterruptedException ie) {
                System.out.println(ie.getMessage());
            }
                    
        }   
                
    });
    1) mi fa il println() di rigo //1 ma non l'append()
    2) implementa quarto, invoca giocaQuarto(), disabilita scrivi (la mia JTextArea) e bottone ma al click su esso si blocca la GUI, non funziona nemmeno il previsto
    codice:
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    e devo procedere da prompt con Ctrl+C.

    tuaScelta e avvers1 sono delle variabili globali int; il try/catch è richiesto poiché c'è in giocaQuarto() c'è un Thread.sleep()...
    Nella JTextArea appare il messaggio che la squadra corrispondente all'item 0 del Choice ha perso contro sè stessa, sebbene in SquadreNomi[], stampati su prompt, appaiano i nomi giusti. Non capisco perché non passano i parametri (Squadre è un ArrayList di oggetti Squadra, con gli stessi indici dell'array di String SquadreNomi[]).
    L'intero programma funziona senza GUI.
    Ultima modifica di Gas75; 17-05-2022 a 11:21

  7. #7

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.