2011-04-08 5 views
0

Je travaille sur une applet, qui a un JButton que je veux utiliser pour activer un autre JButton. Cependant, lorsque j'appuie sur le bouton, j'obtiens l'erreur: Exception dans le fil "AWT-EventQueue-1" java.lang.NullPointerException. Pourquoi cela arrive-t-il? Il semble que lorsque j'exécute l'applet, les variables globales ne sont pas instanciées (c'est-à-dire qu'elles sont toutes "nulles"). Dans un autre programme, tout fonctionne bien, et je ne trouve aucune différence entre les deux en termes de mise en œuvre de cette action.Java Applet NullPointerException

Voici un peu de mon code:

public class implementation2 extends Applet implements ActionListener { 
    private static final long serialVersionUID = -4370650602318597069L; 
    ... 
    public JButton coreButton, testButton; 
    ... 
    public void init() { 
    ... 
    final JButton testButton = new JButton("Test); 
    testButton.addActionListener(this); 
    ... 
    final JButton coreButton = new JButton("CORE"); 
    coreButton.addActionListener(this); 
    coreButton.setEnabled(false); 
    ... 
    } 
    ... 
    public void actionPerformed(final ActionEvent event) { 

    if(event.getActionCommand() == "Test") { 
    coreButton.setEnabled(false); 
    } 
    ... 

Si quelqu'un peut me diriger dans la direction de fixer mon code, qui serait grandement appréciée! Je vous remercie!

+1

Vous devriez avoir une trace de pile - regardez ceci pour identifier ce qui se passe. Vous devriez également commencer à utiliser les conventions de nommage Java normales (les classes devraient être dans PascalCase), et comparer les chaînes en utilisant 'equals()' au lieu de '=='. –

Répondre

1

C'est le problème:

public JButton coreButton, testButton; 

public void init() { 
    final JButton testButton = new JButton("Test); 

Ici, vous avez créé une variable variable locale qui l'ombres instance pour testButton (et même pour coreButton). Cela signifie que les variables d'instance sont toujours nulles - donc lorsque vous essayez de les déréférencer plus tard, vous obtenez une exception. Vous ne voulez pas déclarer de nouvelles variables locales dans init - vous souhaitez simplement affecter les valeurs aux variables d'instance. code corrigé:

public class Implementation2 extends Applet implements ActionListener { 
    private static final long serialVersionUID = -4370650602318597069L; 
    ... 
    public JButton coreButton, testButton; 
    ... 
    public void init() { 
    ... 
    testButton = new JButton("Test"); 
    testButton.addActionListener(this); 
    ... 
    coreButton = new JButton("CORE"); 
    coreButton.addActionListener(this); 
    coreButton.setEnabled(false); 
    ... 
    } 
    ... 
    public void actionPerformed(final ActionEvent event) { 
    if("Test".equals(event.getActionCommand())) { 
     coreButton.setEnabled(false); 
    } 
    ... 
    } 
} 
+0

Ah je vois. Je pensais que cela avait l'air schématique, mais je réutilise en grande partie le code (permissivement, bien sûr) pour que ça puisse se foirer assez facilement. Merci beaucoup! – TNC

1

Lorsque vous les déclarez mondiale alors pourquoi à nouveau les déclarer dans init() dans init() il suffit d'écrire:

public void init() { 
    ... 
    testButton = new JButton("Test"); 
    testButton.addActionListener(this); 
    ... 
    coreButton = new JButton("CORE"); 
    coreButton.addActionListener(this); 
    coreButton.setEnabled(false); 
    ... 
    } 

bogues possibles dans votre code:

public class implementation2 extends Applet implements ActionListener { 
    private static final long serialVersionUID = -4370650602318597069L; 
    ... 
    public JButton coreButton, testButton; 
    ... 
    public void init() { 
    ... 
    final JButton testButton = new JButton("Test); //---- Duplicate declaration which should not be done. 
    //---- Forgot to write `"` to finish `Test` string 
    testButton.addActionListener(this); 
    ... 
    final JButton coreButton = new JButton("CORE"); //---- Duplicate declaration which should not be done. 
    coreButton.addActionListener(this); 
    coreButton.setEnabled(false); 
    ... 
    } 
    ... 
    public void actionPerformed(final ActionEvent event) { 

    if(event.getActionCommand() == "Test") { //--- use `.equals()` instead of `==` 
    coreButton.setEnabled(false); //---- set it to `true` instead of `false`. 
    } 
0

Dans init(), vous faites 2 boutons locaux qui masquent les externes, donc ils sont toujours nuls après init().