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?
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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Grazie mille!![]()
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.
Il programma esegue le istruzioni seguenti ma appunto non considera la squadra selezionata, a parte scrivermela nella JTextArea scrivi.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"); } } });
Ho provato a riprodurre la situazione che avevo con il button, cioè inserendo le istruzioni nel listener, ottenendo un
su una classe definita nel caller, che è perfettamente scritta e implementata dato che lasciando le istruzioni successive fuori dal listener funziona.Exception in thread "main" java.lang.NoClassDefFoundError
Ho anche provato a spostare le istruzioni successive nell'if del listener, e Java mi lancia
ma se aggiungo il relativo throws dichiarando il metodo, mi dice che non posso implementarlo in quel metodo.unreported exception InterruptedException; must be caught or declared to be thrown
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.
Ho ripristinato l'evento sul JButton, ma non funzionano molte cose...
1) mi fa il println() di rigo //1 ma non l'append()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()); } } });
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
e devo procedere da prompt con Ctrl+C.codice:setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
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
Tutto ancora bloccato.![]()