KeyListener funktioniert nicht während Timer läuft

M4_ix

Mitglied
Hallo,
ich möchte ein Spiel programmieren bei dem es 9 Labels gibt und eines immer rot aufleuchtet und man dann eine entsprechende zahlentaste drücken soll, also eine Art Reaktionsspiel.
Mein Problem ist, dass der KeyListener nicht mehr funktioniert wenn ich den Startbutton klicke.
Ich denke es ist wegen dem Thread vom Timer , ich weis aber nicht wie ich das Problem lösen soll. Hier mein Code:
Java:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class test {
    static boolean a = true;
    static int i = 0;
    static    JFrame jf1 = new JFrame("Reaktionsspiel");
    static Timer timer = new Timer();
    public static void main(String[] args) {
        // TODO Auto-generated method stub

   
        JLabel jl1 = new JLabel("1");
        JLabel jl2 = new JLabel("2");
        JLabel jl3 = new JLabel("3");
        JLabel jl4 = new JLabel("4");
        JLabel jl5 = new JLabel("5");
        JLabel jl6 = new JLabel("6");
        JLabel jl7 = new JLabel("7");
        JLabel jl8 = new JLabel("8");
        JLabel jl9 = new JLabel("9");
        JPanel jp1 = new JPanel();
        JPanel jp3 = new JPanel();
        JPanel jp2 = new JPanel();
        JButton jb1 = new JButton("Spiel starten");
        JButton jbclose = new JButton("Schließen");
        JLabel jlo = new JLabel();
       
        jf1.setVisible(true);
        jf1.setSize(500, 500);
        jf1.getContentPane().setBackground(Color.GREEN);
        jf1.setLayout(new GridLayout(4,3));
        jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf1.add(jp1);
        jf1.add(jp2);
        jf1.add(jp3);
        jp1.add(jb1);
        jp2.add(jbclose);
        jp3.add(jlo);
        jf1.add(jl1);
        jf1.add(jl2);
        jf1.add(jl3);
        jf1.add(jl4);
        jf1.add(jl5);
        jf1.add(jl6);
        jf1.add(jl7);
        jf1.add(jl8);
        jf1.add(jl9);
        jl1.setOpaque(true);
        jl2.setOpaque(true);
        jl3.setOpaque(true);
        jl4.setOpaque(true);
        jl5.setOpaque(true);
        jl6.setOpaque(true);
        jl7.setOpaque(true);
        jl8.setOpaque(true);
        jl9.setOpaque(true);
       
       
        jf1.addKeyListener(new KeyListener() {
              public void keyPressed(KeyEvent e) {
                   
                    System.out.println(e.getKeyChar() + " pressed");

                     if(i==1 && e.getKeyChar() ==1 ){
                        
                         System.out.println("Ok");
                                     }else{
                                         timer.cancel();
                
                                     }
                    
   
                }
                public void keyReleased(KeyEvent e) {
                  
                }
                public void keyTyped(KeyEvent e) {
                  
                   
                }
        });       
       
   
        jb1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt){
       
               
                 TimerTask timerTask = new TimerTask() {
                     public void run() {
                        
                       
                         i =(int) (Math.random() * 9) + 1;
                       
                         if(i==1){
                             jl1.setBackground(Color.RED);
                         }else{
                             jl1.setBackground(Color.GREEN);
                         }
                        
                        
                         if(i==2){
                             jl2.setBackground(Color.RED);
                         }else{
                             jl2.setBackground(Color.GREEN);
                         }
                         if(i==3){
                             jl3.setBackground(Color.RED);
                         }else{
                             jl3.setBackground(Color.GREEN);
                         }
                         if(i==4){
                             jl4.setBackground(Color.RED);
                         }else{
                             jl4.setBackground(Color.GREEN);
                         }
                         if(i==5){
                             jl5.setBackground(Color.RED);
                         }else{
                             jl5.setBackground(Color.GREEN);
                         }
                         if(i==6){
                             jl6.setBackground(Color.RED);
                         }else{
                             jl6.setBackground(Color.GREEN);
                         }
                         if(i==7){
                             jl7.setBackground(Color.RED);
                         }else{
                             jl7.setBackground(Color.GREEN);
                         }
                         if(i==8){
                             jl8.setBackground(Color.RED);
                         }else{
                             jl8.setBackground(Color.GREEN);
                         }
                         if(i==9){
                             jl9.setBackground(Color.RED);
                         }else{
                             jl9.setBackground(Color.GREEN);
                         }
                        
                        
                        
                        
                     }
                 };
                  
                   timer.schedule(timerTask,1000, 750);     
               
               
               
               
           
               
               
           
               
            }
           
       
           
           
        });
       
       
        
       
       
        jbclose.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt){
        System.exit(1);
       
            }
        });
       
    }

}

LG M4_ix
 
Würde mal vermuten dass dein jtf1 den Focus verliert, nach dem der Button gedrückt wurde.
Du könntest mit setFocusable(false) verhindern, dass der Button den Focus bekommt.

Generell würde ich dir aber eher zu KeyBindings raten. Die sind mMn schon allein deshalb besser, weil sie mehr Funktionalität bieten.

Gruß Robert
 
Erstmal danke für deine schnelle Antwort.
ich habe es gerade mit setFocussable(false) probiert, hat aber nicht funktioniert. Also will ich es jetzt mit KeyBindings probieren, ich habe aber keine Ahnung davon und konnte auf die schnelle nichts im Internet finden, kannst du mir eventuell ein Beispiel sagen?
 
Ich habe mal ein Code Beispiel, vom Link, ausprobiert und es hat nicht funktioniert.
Java:
AbstractAction doNothing = new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        //do nothing
        System.out.println("1 gedrückt");
    }
};
jl1.getInputMap().put(KeyStroke.getKeyStroke("1"),
                            doNothing);
jl1.getActionMap().put("doNothing",
                             doNothing);
🙁
 
Also ich habs grad noch mal ausprobiert.
Wenn du in dem ActionListener für deinen Startbutton dem jf1 den Focus gibst sollte es funktionieren.

--
Zu den KeyBindings:
Java:
AbstractAction doNothing = new AbstractAction()
{
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("foo");
    }
};
jl1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("T"), "FOO");
jl1.getActionMap().put("FOO", doNothing);

Du kannst bei einem KeyBinding mitgeben wann das Event ausgelöst werden soll.
In dem Fall immer dann, wenn die Komponente selbst den Focus hat oder in dem Fenster ist welches den Focus hat.

Gruß Robert 🙂
 
Ich habe jetzt den KeyListener dem Startbutton hinzugefügt, jetzt funktioniert der KeyListener auch wenn der Timer Läuft, aber wenn ich dann ne Taste drücke wird zwar ausgegeben welche, aber der Timer hört dann irgeendwie auf zu laufen
 
aber wenn ich dann ne Taste drücke wird zwar ausgegeben welche, aber der Timer hört dann irgeendwie auf zu laufen
Weil du es dem Programm doch so gesagt hast 😉

Java:
    if (i == 1 && e.getKeyChar() == 1)
        System.out.println("Ok");
    else
        timer.cancel();

Wenn i 1 ist und die gedrückte Taste 1 ist dann soll Ok ausgegeben werden. In jedem anderen Fall soll der timer gestoppt werden.
 
Bei mir funktioniert es, wenn der Focus gesetzt wird (was du laut #9 gemacht hast) und ich es auf 'änder', zeig doch mal wie dein Code jetzt aussieht
 
Zuletzt bearbeitet:
Also ich habe hier keinen Fokus gesetzt😵

Java:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class test {
    static boolean a = true;
    static int i = 0;
    static    JFrame jf1 = new JFrame("Reaktionsspiel");
    static Timer timer = new Timer();
    public static void main(String[] args) {
        // TODO Auto-generated method stub

  
        JLabel jl1 = new JLabel("1");
        JLabel jl2 = new JLabel("2");
        JLabel jl3 = new JLabel("3");
        JLabel jl4 = new JLabel("4");
        JLabel jl5 = new JLabel("5");
        JLabel jl6 = new JLabel("6");
        JLabel jl7 = new JLabel("7");
        JLabel jl8 = new JLabel("8");
        JLabel jl9 = new JLabel("9");
        JPanel jp1 = new JPanel();
        JPanel jp3 = new JPanel();
        JPanel jp2 = new JPanel();
        JButton jb1 = new JButton("Spiel starten");
        JButton jbclose = new JButton("Schließen");
        JLabel jlo = new JLabel();
      
        jf1.setVisible(true);
        jf1.setSize(500, 500);
        jf1.getContentPane().setBackground(Color.GREEN);
        jf1.setLayout(new GridLayout(4,3));
        jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf1.add(jp1);
        jf1.add(jp2);
        jf1.add(jp3);
        jp1.add(jb1);
        jp2.add(jbclose);
        jp3.add(jlo);
        jf1.add(jl1);
        jf1.add(jl2);
        jf1.add(jl3);
        jf1.add(jl4);
        jf1.add(jl5);
        jf1.add(jl6);
        jf1.add(jl7);
        jf1.add(jl8);
        jf1.add(jl9);
        jl1.setOpaque(true);
        jl2.setOpaque(true);
        jl3.setOpaque(true);
        jl4.setOpaque(true);
        jl5.setOpaque(true);
        jl6.setOpaque(true);
        jl7.setOpaque(true);
        jl8.setOpaque(true);
        jl9.setOpaque(true);
        jf1.setFocusable(true);
      
        jb1.addKeyListener(new KeyListener() {
              public void keyPressed(KeyEvent e) {
                  
                  

                     if(i==1 && e.getKeyChar() == '1' ){
                         System.out.println("Ok");
                       
                                     }else{
                                         timer.cancel();
                                       
                                     }
if(i==2 && e.getKeyChar() == '2' ){
                       
                         System.out.println("Ok");
                                     }else{
                                         timer.cancel();
               
                                     }

if(i==3 && e.getKeyChar() ==3 ){
      
        System.out.println("Ok");
                    }else{
                        timer.cancel();

                    }
if(i==4 && e.getKeyChar() ==4 ){
      
        System.out.println("Ok");
                    }else{
                        timer.cancel();

                    }
if(i==5 && e.getKeyChar() ==5){
      
        System.out.println("Ok");
                    }else{
                        timer.cancel();

                    }
if(i==6 && e.getKeyChar() ==6 ){
      
        System.out.println("Ok");
                    }else{
                        timer.cancel();

                    }
if(i==7 && e.getKeyChar() ==7 ){
      
        System.out.println("Ok");
                    }else{
                        timer.cancel();

                    }
if(i==8 && e.getKeyChar() ==8 ){
      
        System.out.println("Ok");
                    }else{
                        timer.cancel();

                    }
if(i==9 && e.getKeyChar() ==9 ){
      
        System.out.println("Ok");
                    }else{
                        timer.cancel();

                    }

                   
  
                }
                public void keyReleased(KeyEvent e) {
                 
                }
                public void keyTyped(KeyEvent e) {
                 
                  
                }
        });      
      
      
        jb1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt){
      
              
                 TimerTask timerTask = new TimerTask() {
                     public void run() {
                         // Was immer du machen willst
                      
                         i =(int) (Math.random() * 9) + 1;
                      
                         if(i==1){
                             jl1.setBackground(Color.RED);
                         }else{
                             jl1.setBackground(Color.GREEN);
                         }
                       
                       
                         if(i==2){
                             jl2.setBackground(Color.RED);
                         }else{
                             jl2.setBackground(Color.GREEN);
                         }
                         if(i==3){
                             jl3.setBackground(Color.RED);
                         }else{
                             jl3.setBackground(Color.GREEN);
                         }
                         if(i==4){
                             jl4.setBackground(Color.RED);
                         }else{
                             jl4.setBackground(Color.GREEN);
                         }
                         if(i==5){
                             jl5.setBackground(Color.RED);
                         }else{
                             jl5.setBackground(Color.GREEN);
                         }
                         if(i==6){
                             jl6.setBackground(Color.RED);
                         }else{
                             jl6.setBackground(Color.GREEN);
                         }
                         if(i==7){
                             jl7.setBackground(Color.RED);
                         }else{
                             jl7.setBackground(Color.GREEN);
                         }
                         if(i==8){
                             jl8.setBackground(Color.RED);
                         }else{
                             jl8.setBackground(Color.GREEN);
                         }
                         if(i==9){
                             jl9.setBackground(Color.RED);
                         }else{
                             jl9.setBackground(Color.GREEN);
                         }
                       
                       
                       
                       
                     }
                 };
                 
                   timer.schedule(timerTask,1000, 1000);    
              
              
              
              
          
              
              
          
              
            }
          
      
          
          
        });
      
      
       
      
      
        jbclose.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt){
        System.exit(1);
      
            }
        });
      
    }

}
 
Code:
if (i == 1 && e.getKeyChar() == '1') {
    System.out.println("Ok");
} else if (i == 2 && e.getKeyChar() == '2') {
    System.out.println("Ok");
} ...
else {
    timer.cancel();
}
 
Naja dann mache ich es einfach so, dass man 60 sek Zeit hat um so oft wie möglich richtig zu drücken, also n score sammeln, das sollte ja nicht so schwer sein.
Danke für eure Antworten 🙂
LG M4_ix
 

Neue Themen


Zurück
Oben