Je suis la programmation d'un JToggleButton
pour charger à/jeter de la mémoire la configuration d'un élément (une configuration du télescope), donc je l'ai ajouté un JComboBox
dans un JFrame
et près de lui sur le bouton charger l'élément sélectionné. Lorsque le JToggleButton
est sélectionné, une icône de disque dur est affichée, une autre icône sinon. J'utilise l'éditeur IntelliJ IDEA GUI pour cela. Bien sûr, je l'ai ajouté un ItemListener
(comme l'a suggéré à partir du Web) à ce bouton:JToggleButton addItemListener semble répéter la ItemListener pour toujours
loadTelescopeButton.setSelected(true);
System.out.println(loadTelescopeButton.isSelected());
loadTelescopeButton.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println("LAODACTION " + loadTelescopeButton.isSelected());
try {
if (e.getStateChange() == ItemEvent.SELECTED) {
String selected = telescopesList.getSelectedItem().toString();
if ((selected != null) && (!selected.equals("")) && (ObjUtils.isAlphaNumeric(selected))) {
//...
} else {
showErrorMessage("Invalid id selected!");
}
} else if (e.getStateChange() == ItemEvent.DESELECTED) {
if ((configurationActivity != null) && (configurationActivity.getManager() != null) &&
(configurationActivity.getTelescope() != null) && (configurationActivity.getTelescope().isConnected())) {
//...
} else {
//...
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
Sortie:
true
-> Lorsque la fenêtre est affichée
LAOD_ACTION false
-> Quand je cliquez sur le bouton
J'ai fait quelques tests avec quelques nouveaux boutons à bascule et ils m'ont donné la même erreur: le code à l'intérieur itemStateChanged(ItemEvent e) {...}
est répété pour toujours, sans stoppi ng! Dans ce morceau de code, il n'y a pas de boucles for
et while
! Le résultat est un grand nombre de boîtes de dialogue de message (une seule boîte de dialogue doit être affichée), et si je mets une autre fenêtre sur mon bureau, l'écran derrière les boîtes de dialogue devient noir (la zone de la fenêtre parent). J'ai changé l'écouteur à ActionListener
et maintenant tout est exécuté une fois/clic.
Pourquoi cette erreur? J'ai copié ce code de https://stackoverflow.com/a/7524627/6267019, comme vous pouvez le voir.
Code complet sur GitHub Here, J'ai mis en évidence le code pour ce bouton bascule. La même erreur se produit avec d'autres JToggleButton
s dans mon fichier MainActivity.java
, et aussi lorsque le débogage IntelliJ me permet de voir que le code dans l'écouteur est répété pour toujours. Après quelques milliers de dialogues Windows me montre un message et ferme Java Platform Binary avec une erreur.
EDIT:
Le même problème dans une nouvelle classe:
import javax.swing.*;
import java.awt.*;
public class ErrorGUI extends JFrame {
public ErrorGUI() throws HeadlessException {
super("ciao");
JPanel panel1 = new JPanel();
setContentPane(panel1);
JToggleButton ciaoToggleButton = new JToggleButton("cajs");
ciaoToggleButton.setSelected(true);
ciaoToggleButton.addItemListener(e -> {
System.out.println("caiooasfsdvn");
try {
JOptionPane.showMessageDialog(panel1, "skjngksfnb");
} catch (Exception e2) {
e2.printStackTrace();
}
});
panel1.add(ciaoToggleButton);
pack();
setVisible(true);
}
public static void main(String[] args) {
new ErrorGUI();
}
}
Je sais ce fait et j'en suis désolé, mais comment puis-je poster 1200 lignes de code ou le code XML du générateur IntelliJ IDEA GUI? Quel exemple puis-je fournir, si les exemples du Web fonctionnent bien? – SquareBoot
C'est le problème !! Les exemples fonctionnent! Si je crée un nouveau projet, j'ajoute un 'main' et j'écris le code pour un' JFrame' avec un bouton bascule, ça marche! – SquareBoot
Mon idée du bogue est qu'il est causé par une erreur interne du générateur IntelliJ IDEA GUI. Maintenant, je crée la même erreur dans un nouveau prj. – SquareBoot