2013-07-04 10 views
-1

Je viens de commencer à apprendre Java il y a 1 semaine, et je suis 100% totalement débutant. Dans ce code, je n'arrive pas à mettre un actionlistener/en faire fonctionner un. Je ne sais même pas où/comment/de quelle manière le mettre, malgré la lecture de dizaines de tutoriels. J'ai créé un JFrame avec un JPanel, et sur le JPanel il y a un bouton. Jusqu'ici tout va bien (et travaille). Mais alors, je veux qu'il en soit ainsi, si l'on clique sur le bouton, un autre bouton apparaît. Merci beaucoup d'avance!Java actionlistener ne fonctionne pas

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 
public class Skeleton extends JFrame implements ActionListener { 

    public static void main(String[] args) { 
    //------------------------------------------------ 
    JFrame frame = new JFrame("Skeleton"); 
    JPanel panel = new JPanel(); 
frame.setContentPane(panel); 
    frame.setSize(600,600); 
    frame.setResizable(false); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    JButton button = new JButton("This is a button."); 
    JButton button2 = new JButton("Hello"); 
    panel.setLayout(null); 
    button.setBounds(20,20,200,25); 
    button2.setBounds(20,70,200,25); 
    panel.add(button); 
    //------------------------------------------- 

button.addMouseListener(this); 


} 

public void ActionPerformed(ActionEvent e) { 
    System.out.println("Hello"); 

} 
} 

Répondre

2

Vous devez ajouter l'actionlistener.

Enregistrez une instance de la classe du gestionnaire d'événements en tant qu'écouteur sur un ou plusieurs composants. Par exemple:

yourdesiredcomponent.addActionListener(this); 

Pour plus de détails vérifier la doc

+0

Merci Stène –

4

je vais vous donner quelques conseils

1) Ne pas mettre en œuvre ActionListener dans les classes supérieures, utilisent des classes anonymes ou des classes privées au lieu.

Exemple:

classe Anonymous (aussi appelée swing Actions)

myComponent.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent evt){ 
       //code here 
     } 

}) 

ou

//inner class 
public class Skeleton{ 

// in some part 
private class MyActionListener implements ActionListener{ 
     public void actionPerformed(ActionEvent evt){ 
      //code here 
     } 
} 


} 

2) Votre code ne compilera pas parce que vous n'êtes pas implémentant l'interface ActionListener

public void actionPerformed(ActionEvent evt) est la signature.

Vous avez à addActionListener à votre composant

button.addActionListener(this);

3) Ne pas utiliser la mise en page nulle, parce que vous aurez beaucoup de problème si vous souhaitez ajouter d'autres composants ou Redimensionner les fenêtres parce que vous avoir à setBounds manuellement et il sera frustrant à la place utiliser [Layout Manager][1].

4) Essayez de ne pas étendre JFrame si cela n'est pas nécessaire au lieu d'avoir une référence dans votre classe, par exemple.

public class Skeleton{ 

    private JFrame frame; 

    } 
+0

+1. Mais je suis mal à l'aise avec votre quatrième point. C'est toujours un bon moyen d'étendre JFrame pour récolter ses bénéfices maximum. – Mac

+1

@Mac si vous voulez ajouter un héritage de plus niveau, je pense qu'avec la composition vous pouvez faire la même chose ... au moins vous voulez surcharger une méthode par exemple paint .. dans ce cas vous pouvez aussi utiliser des classes anonymes .. – nachokk

+0

Mais s'il y a un module qui va devenir standard pour l'ensemble de votre projet alors créer une nouvelle classe personnalisée minimisera beaucoup de redondance en vous fournissant un module unique que vous pouvez étendre (** REUSE **) dans vos autres classes du même projet sans vous soucier des règles de base .. – Mac