[JAVA] Swing mit KeyListener

Hi!

Ich wollte ein Spiel programmieren, dass so ähnlich wie Tetris ist. Wenn man die Pfeiltaste nach unten drückt (VK_DOWN) drückt, fällt der Stein einfach ein Feld nach unten.

Ich hab jetzt ein bisschen rumprobiert und dann entstand folgendes Problem:

Ich hab 2 Panel, im Einen ist das Spielfeld und im Anderen sollen dann Menü, Statistik usw. untergebracht werden.
Der Keylistener für das Spielfeld funktionierte einwandfrei. Dann hab ich im Menü-Panel ein Button hinzugefügt... Der Keylistener reagiert dann nicht mehr. Wenn ich den Button wieder entferne, gehts. Jetzt meine eigentliche Frage: Warum blockiert der Button den Keylistener?

Die Klasse PuzzleTetris:
Code:
package spiel;

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class PuzzleTetris extends JFrame
{
    public static JLabel[][] feld  = new JLabel[10][10];   
    JPanel spielfeld = new JPanel();  
    JPanel menu   = new JPanel();
    JButton test = new JButton("Test"); 
    Container cp = getContentPane();
    
    public PuzzleTetris()
    {       
        super("PuzzleTetris");      
        this.setSize(665,490);
        this.setLocation((this.getToolkit().getScreenSize().width  - getSize().width ) / 2,
                         (this.getToolkit().getScreenSize().height - getSize().height) / 2);
        this.setResizable(false);
        this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
        
        cp.setLayout(new FlowLayout(FlowLayout.LEFT,50,100));
        cp.setBackground(Color.darkGray);
        cp.add(spielfeld);
        cp.add(menu);       
        
        spielfeld.setLayout(new GridLayout(10,10));
        spielfeld.setPreferredSize(new Dimension(304,304));
        spielfeld.setBorder(new LineBorder(Color.black,2));
        
        menu.setLayout(new FlowLayout(FlowLayout.CENTER,20,50));
        menu.setPreferredSize(new Dimension(200,300));
        menu.setBackground(Color.darkGray);  
        
        menu.add(test);
        
        addKeyListener(new Tasten());
        for(int i=0; i<10; i++)
        {
            for(int j=0; j<10; j++)
            {
                feld[j][i] = new JLabel(" ",JLabel.CENTER);
                feld[j][i].setOpaque(true);  
                feld[j][i].setBackground(Color.lightGray);
                spielfeld.add(feld[j][i]);               
            }
        }         
    }   
    
    public static void main(String[] args)
    {
        PuzzleTetris game = new PuzzleTetris();
        game.setVisible(true);     
    }
}

Die Klasse Key:
Code:
package spiel;

import java.awt.Color;
import java.awt.event.*;


public class Key extends KeyAdapter 
{
    int k=1;
    public void keyPressed(KeyEvent e) 
    {              
        if (e.getKeyCode()==KeyEvent.VK_DOWN) 
        {  
            if(k<10)
            {
                PuzzleTetris.feld[4][k].setBackground(Color.blue);
                PuzzleTetris.feld[4][k-1].setBackground(Color.lightGray);
                k++;
            }
            else
            {
                PuzzleTetris.feld[4][1].setBackground(Color.blue);
                k=2;
                PuzzleTetris.feld[4][9].setBackground(Color.lightGray);
            }
                
        }           
    }
}


Wenn ich in der Klasse PuzzleTetris die Code-Zeile 37 entferne, funktioniert der Keylistener.

Ich hoffe, dass mir jemand erklären kann, was ich falsch mache.

Gruß, Boar
 
ich vermute mal weil der jbutton den focus hat. adde den keylistener mal nur dem spielfeld und nicht dem gesamten jframe und gibt dem spielfeld den focus.
ganz praktisch wäre wohl ein focuslistener der dem spielfeld den focus zurück gibt sobald dieses den focus verliert.
 
Dankeschön, Problem gelöst!

Wenn du sonst noch Verbesserungsvorschläge hast, nur her damit! :)

Gruß, Boar
 
Zurück
Oben