2017-02-09 1 views
1

C'est très difficile à expliquer mais quand je suis sur le menu principal j'appuie sur le bouton 1 pour entrer en jeu, le bouton 2 pour entrer dans les rangs, le bouton 3 pour quitter. Maintenant, si j'appuie sur le bouton 2 pour entrer dans les rangs, puis appuyez sur le bouton 1 pour revenir au menu, je vais directement dans le jeu et ne pas rester sur le menu.Action Listener est rapide et j'entre dans le menu suivant

Y at-il de toute façon que je peux le coder pour dire sur le menu au lieu d'entrer instantanément dans le jeu?

Moteur:

import javax.swing.*; 

import com.wicke.main.game.Level1; 

@SuppressWarnings("serial") 
public class Engine extends JFrame { 

    // Adding Classes 
    Level1 lvl1 = new Level1(this); 

    // System Variables 
    public JButton button1; 
    public JButton button2; 
    public JButton button3; 
    public JTextArea textArea1; 

    public static void main(String[] args){ 

     new Engine(); 

    } 

    public Engine(){ 
     // GUI Variables 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setSize(900,600); 
     this.setLocationRelativeTo(null); 
     this.setResizable(false); 
     this.setTitle("Dungeon Drivers Alpha 0.2.3"); 

     JPanel thePanel = new JPanel(); 

     textArea1 = new JTextArea(33, 80); 
     textArea1.setText("Window launch was Successful.\n"); 
     textArea1.setEditable(false); 
     textArea1.setLineWrap(true); 
     textArea1.setWrapStyleWord(true); 
     thePanel.add(textArea1); 

     JScrollPane scrollbar1 = new JScrollPane(textArea1, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     thePanel.add(scrollbar1); 

     button1 = new JButton(); 
     button1.setText("1"); 
     thePanel.add(button1); 

     button2 = new JButton(); 
     button2.setText("2"); 
     thePanel.add(button2); 

     button3 = new JButton(); 
     button3.setText("3"); 
     thePanel.add(button3); 

     this.add(thePanel); 
     this.setVisible(true); 

     lvl1.Game(); 
    } 

} 

Ensuite, il y a niveau1:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import com.wicke.main.Engine; 
import com.wicke.main.data.Ranks; 

public class Level1 { 
    private Engine engine; 

    public Level1(Engine engine) { 
     this.engine = engine; 
    } 

    public void Game() { 
     engine.textArea1.append("\tWelcome to Dungeon Drivers!\n"); 
     engine.textArea1.append("\tPress 1 to Start\n"); 
     engine.textArea1.append("\tPress 2 to Enter Local Leaderboard\n"); 
     engine.textArea1.append("\tPress 3 to Exit\n"); 
     engine.button1.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e){ 
        start(); 
       } 
      }); 
     engine.button2.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e){ 
        Leaderboard(); 
       } 
      }); 
     engine.button3.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e){ 
        System.exit(0); 
       } 
      }); 
    } 

    private void Leaderboard() { 
     engine.textArea1.setText(""); 
     engine.textArea1.append("\t1. " + Ranks.rank1 + "\n"); 
     engine.textArea1.append("\t2. " + Ranks.rank2 + "\n"); 
     engine.textArea1.append("\t3. " + Ranks.rank3 + "\n"); 
     engine.textArea1.append("\t4. " + Ranks.rank4 + "\n"); 
     engine.textArea1.append("\t5. " + Ranks.rank5 + "\n"); 
     engine.textArea1.append("\tPress 1 to return."); 
     engine.button1.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e){ 
        engine.textArea1.setText(""); 
        Game(); 
       } 
      }); 
    } 

    private void start() { 
     engine.textArea1.setText(""); 
     engine.textArea1.append("Test"); 
    } 
} 
+0

départ javax.swing.Timer – ControlAltDel

+0

Pour mieux aider plus tôt poster un [mcve]. – MasterBlaster

+1

Vous ajoutez à plusieurs reprises le même bouton 'ActionListener ', donc quand vous démarrez, Button1' a un' ActionListener' pour" démarrer le jeu ", quand vous passez au tableau des leaders, il a maintenant une action supplémentaire" goto to menu ", donc les deux sont en cours d'exécution. Au lieu de cela, séparez la logique en composants distincts, en utilisant peut-être un 'CardLayout' de sorte que chaque bouton fasse UNE action – MadProgrammer

Répondre

2

Donc, votre code va ici, bien, vous ajoutez un ActionListener-button1 et button2

engine.button1.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     start(); 
    } 
}); 
engine.button2.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     Leaderboard(); 
    } 
}); 

Vous appuyez sur button2 et votre code va ici ...

engine.button1.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     engine.textArea1.setText(""); 
     Game(); 
    } 
}); 

Attendez, quoi, vous avez ajouté une autre ActionListener au button1, donc lorsque vous appuyez dessus, il exécute à la fois le start et les méthodes Game ...

lieu , créez des composants séparés pour chaque vue, un pour le menu, un pour le tableau de classement, un pour le jeu, etc, chacun avec leur propre gestion interne et fonctionnalité qui est séparée des autres.

utilisent Peut-être un CardLayout pour faciliter la navigation entre les

Je vous encourage à apprendre aussi sur MVC et utiliser où vous pouvez.

Bien que probablement alors un peu plus avancé que vous êtes à l'utilisation, jetez un oeil à this example et this example des exemples d'utilisation d'un CardLayout dans la mise en œuvre de style MVC

+0

Son programme actuel est un ** lot ** meilleur que le code qu'il avait dans sa question précédente, que ce soit avec des boucles tout imbriquées et tout. 1+ –

+0

@HovercraftFullOfEels Ah, au moins, nous faisons des progrès – MadProgrammer

+0

:) Vous êtes géniaux. –