Dans ma méthode actionPerformed, j'ai les deux lignes de code suivantes,

JButton pressed =(JButton)e.getSource();
JMenuItem pressedSave = (JMenuItem)e.getSource();

Pourquoi est-ce interdit? J'obtiens l'erreur de compilateur suivante

Exception dans le thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JButton ne peut pas être converti en javax.swing.JMenuItem

Je dois pouvoir obtenir le texte pour un JButton et un JMenuItem. Comment puis-je faire ceci?

-2
ugCode 1 janv. 2016 à 23:27

3 réponses

Meilleure réponse

L'erreur est très claire. Vous essayez d'attribuer un Jbutton à un JMenuItem.

Vous obtenez l'erreur sur la ligne 2 , ce qui signifie que la ligne 1 est parfaite, ce qui implique également que e.getSource() est un JButton, pas un JMenuItem.

Ce que vous pouvez faire, c'est utiliser l'opérateur instanceof pour déterminer quel composant a déclenché l'événement:

Object comp = e.getSource();

if(comp instanceof JButton) {
    // A JButton triggered the event
    JButton pressed =(JButton) comp;

    // Do something with your 'pressed' button
}
else if(comp instanceof JMenuItem) {
    // A JMenuItem triggered the event
    JMenuItem pressedSave = (JMenuItem) comp;

    // Do something with your 'pressedSave' menu item
}
1
Mohammed Aouf Zouag 1 janv. 2016 à 20:46

Vous n'obtenez pas d'erreur de compilation.

C'est "autorisé" , cela ne fonctionne tout simplement pas.

Si ce n'était pas autorisé, le compilateur se plaindrait.

Mais ce que vous avez ici est une RuntimeException parce que vous avez un JButton qui ne peut tout simplement pas être converti en JMenuItem. Ce sont des types non liés - à quoi devrait ressembler une conversion / distribution entre ces deux?

Ce que vous pouvez faire, c'est convertir les deux types JButton et JMenuItem en leur supertype commun AbstractButton.

1
luk2302 1 janv. 2016 à 20:30

JMenuItem n'est pas une sous-classe de JButton, mais vous pouvez convertir les deux en AbstractButton. Cela peut fonctionner selon ce que vous voulez faire

1
Gacci 1 janv. 2016 à 20:32