KeyListener nie działa po wciśnieciu przycisku na innym panelu.

0

Witam. Jeśli zaśmiecam to sory ale potrzebuje tego na wczoraj na zaliczenie. Piszę snake i wszystko było ok dopóki nie chciałem dodać jakiego panelu kontrolnego. Po dodaniu nowego panelu i wciśnięciu na nim przycisku Kaylistener przestaje reagować. Poniżej umieszczam szkielet programu. Z góry dzięki za pomoc.

package test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;


public class Test extends JFrame{
    
    private final int WIDTH = 1000;
    private final int HEIGHT = 800;
    private Board board;
    private ControlPanel controlPanel;
    
    private JButton startGame;
    
    public Test(){
    super("Snake");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        
        setPreferredSize(new Dimension(WIDTH+40, HEIGHT+30)); 
        setLayout(new BorderLayout(20,20));
        
        board = new Board(WIDTH, HEIGHT);
        add(board, BorderLayout.WEST);
        
        controlPanel = new ControlPanel();        
        add(controlPanel, BorderLayout.EAST);
                  
        setVisible(true);
        pack();
    }
    
    
    public static void main(String[] args) {
        new Test();
    }
    
}
 
package test;


import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class ControlPanel extends JPanel{
    
    private static final int WIDTH = 230, HEIGHT = 500;
    
    private final JLabel scoreTxt;
    private JLabel score;
    public JButton startGame;
    
    public void setScore(String score){
        this.score.setText(score);
    }
    
    public ControlPanel(){       
        
        setFocusable(true);
        setPreferredSize(new Dimension(WIDTH, HEIGHT));     
        setLayout(null);
        
        setBorder(BorderFactory.createTitledBorder("Control panel"));
        
        scoreTxt = new JLabel("Score: ");
        scoreTxt.setBounds(30, 20, 50, 30);
        add(scoreTxt);
        
        score = new JLabel("0");
        score.setBounds(100, 20, 100, 30);
        add(score);
        
        
        startGame = new JButton("start game");
        startGame.setBounds(30, 70, 170, 35);

        add(startGame);
       
        setVisible(true);      
    }   
    
    
}
package test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;


public class Board extends JPanel{
    
    private final int WIDTH, HEIGHT;
    private final int SIZE = 10;
    
    private boolean up = false, down = false, right = true, left = false;
    private Key key;
    
    public Board(int width, int height){
        setFocusable(true);
        setLayout(new GridLayout(1,1,0,0));
        setPreferredSize(new Dimension(800, 800));
        
        this.WIDTH = width;
        this.HEIGHT = height;
 
        key = new Key();
        addKeyListener(key);
    }
    
    
    @Override
    protected void paintComponent(Graphics g){       
        g.clearRect(0, 0, WIDTH, HEIGHT); 
        
        for(int i = 0; i < (WIDTH)/SIZE ; ++i){
            g.drawLine(i*SIZE, 0, i*SIZE, HEIGHT);
        }

        for(int i = 0; i < HEIGHT/SIZE; ++i){
            g.drawLine(0, i*SIZE, WIDTH, i*SIZE);
        }           
        
    }
    
    private class Key implements KeyListener{
    
            public void keyPressed(KeyEvent e){
                int key = e.getKeyCode();
                
                if(key == KeyEvent.VK_RIGHT && !left){
                    up = false;
                    down = false;
                    right = true;
                    System.out.println("dfgbdgfb");
                }
                
                if(key == KeyEvent.VK_LEFT && !right){
                    up = false;
                    down = false;
                    left = true;
                    System.out.println("dfgbdgfb");
                }
                
                if(key == KeyEvent.VK_UP && !down){
                    left = false;
                    right = false;
                    up = true;
                    System.out.println("dfgbdgfb");
                }
                
                if(key == KeyEvent.VK_DOWN && !up){
                    left = false;
                    right = false;
                    down = true;
                    System.out.println("dfgbdgfb");
                }
            }

            @Override
            public void keyTyped(KeyEvent e) {       
            }

            @Override
            public void keyReleased(KeyEvent e) {   
            }
    }
}

0

Zdarzenia klawiaturowe docierają do tego elementu, który ma fokus. Jak klikniesz w jakiś przycisk, to przenosisz na niego fokus. Możesz po obsłudze zdarzenia przywrócić fokus planszy - metoda requestFocus.

1 użytkowników online, w tym zalogowanych: 0, gości: 1