@MrEntropy

Почему не работает KeyListener в JavaSwing?

Решил сделать небольшую игру по типу аркадной рыбалки.
В чём суть игры: на данный момент есть три сцены: Хижина, Карта и Озеро.
1. Вы запускаете игру, и начинаете игру с хижины.
2. Нажимаете кнопку со стрелочкой, персонаж выходит из хижины, и стрелка сменяется на кнопку карты
3. Нажимаете на кнопку карты и переходите собственно на карту.
4. На карте, при помощи прозрачных label я реализовал перемещение между локациями, а именно: нажимаешь на рисунки на карте, и пиктограмма персонажа перемещается туда. Потом нажимаешь на кнопку со стрелочкой, и вот ты на той локации, где сейчас и находишься по карте. Кликаем озеро (рисунок глаза), и перемещаемся туда.
5. На озере, мы нажимаем кнопку с крючком, и появляется удочка, которой мы можем двигать клавишами "вправо" или "влево", и на данный момент, пока всё.
У меня всё было в порядке (за исключением того, что иногда label на карте не считывали щелчки мыши), до момента когда я достал удочку и понял что она не двигается по нажатию клавиш.
Полез за подсказкой в интернет, кое где прочитал про такое понятие как фокус в Java, и посоветовали добавить .setFocusable(true);. Проблему это не решило, и я решил проверить работает ли слушатель клавиш вообще с помощью системной строки. В итоге я увидел что следующее:
В сцене с хижиной: работает
На карте: работает
На озере: работает
На озере после того как достал удочку: не работает
На озере после того как убрал удочку: не работает
Обратно на карту с озера: работает
И вот не пойму почему так? Хотел побольше почитать про фокус, но внятной информации слишком мало. Возможно я как то некорректно задал все элементы, ведь для построения сцен, я использовал JLayeredPane.
Части исходного кода

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

public class MainWindow extends JFrame implements ActionListener, MouseListener, KeyListener {

 int LocationIndex = 1;
    boolean RodTake = false;


    MainWindow() {
//Сцена с Хижиной
        PaneShack.setVisible(true);
        PaneShack.setBounds(0, 0, 1000, 800);
        PaneShack.add(Shacklabel, Integer.valueOf(0));
        PaneShack.add(CharacterLabel, Integer.valueOf(1));
        PaneShack.add(buttonNext, Integer.valueOf(2));
        PaneShack.add(buttonMap, Integer.valueOf(2));

        //Сцена с Картой
        PaneMap.setVisible(false);
        PaneMap.setBounds(0, 0, 1000, 800);
        PaneMap.add(MapLabel, Integer.valueOf(0));
        PaneMap.add(BoatLabel, Integer.valueOf(1));
        PaneMap.add(MapPointShack, Integer.valueOf(2));
        PaneMap.add(MapCryLake, Integer.valueOf(2));
        PaneMap.add(MapCity, Integer.valueOf(2));
        PaneMap.add(buttonBack, Integer.valueOf(2));


        //Сцена на Озере
        PaneLake.setVisible(false);
        PaneLake.setBounds(0, 0, 1000, 800);
        PaneLake.add(LakeLabel, Integer.valueOf(0));
        PaneLake.add(buttonHook, Integer.valueOf(2));
        PaneLake.add(RodLabel, Integer.valueOf(2));




        //Настройки Окна
        this.setTitle("Рыбалка в Андере");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setLayout(null);
        this.setSize(1000, 800);
        this.setVisible(true);
        this.addKeyListener(this);

        this.setFocusable(true);
        this.toFront();

        this.add(TimeLabel);
        this.add(PaneShack);
        this.add(PaneMap);
        this.add(PaneLake);

        ImageIcon logo = new ImageIcon("src/Logo.png");
        this.setIconImage(logo.getImage());
        this.getContentPane().setBackground(new Color(0, 139, 139));
    }
//Слушатель кнопок
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == buttonNext) ;
        {
            CharacterLabel.setVisible(true);
            buttonNext.setVisible(false);
            buttonMap.setVisible(true);

        }
        if (e.getSource() == buttonMap) {
            PaneShack.setVisible(false);
            PaneLake.setVisible(false);
            PaneMap.setVisible(true);
        }
        if (e.getSource() == buttonBack) {
            if (LocationIndex == 1) {
                PaneShack.setVisible(true);
                PaneLake.setVisible(false);
                PaneMap.setVisible(false);
                PaneShack.add(buttonMap, Integer.valueOf(2));
            }
            if (LocationIndex == 2) {
                PaneShack.setVisible(false);
                PaneLake.setVisible(true);
                PaneMap.setVisible(false);
                PaneLake.add(buttonMap, Integer.valueOf(2));
            }
        }
        if (e.getSource() == buttonHook) {
            if (!RodTake) {
                RodLabel.setVisible(true);
                RodTake = true;
                RodLabel.setLocation(500, 400);
                buttonMap.setVisible(false);


            } else  {
                RodLabel.setVisible(false);
                buttonMap.setVisible(true);
                RodTake = false;

            }
        }
    }
    //Слушатель мыши
    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getSource() == MapCryLake) {
            BoatLabel.setBounds(800, 389, 40, 40);
            LocationIndex = 2;
        }
        if (e.getSource() == MapCity) {
            BoatLabel.setBounds(500, 180, 40, 40);
            LocationIndex = 3;
        }
        if (e.getSource() == MapPointShack) {
            BoatLabel.setBounds(254, 398, 40, 40);
            LocationIndex = 1;
        }


    }

    @Override
    public void mousePressed(MouseEvent e) {
        if (e.getSource() == MapCryLake) {
            BoatLabel.setBounds(800, 389, 40, 40);
            LocationIndex = 2;
        }
        if (e.getSource() == MapCity) {
            BoatLabel.setBounds(500, 180, 40, 40);
            LocationIndex = 3;
        }
        if (e.getSource() == MapPointShack) {
            BoatLabel.setBounds(254, 398, 40, 40);
            LocationIndex = 1;
        }
    }
//Слушатель клавиш
    @Override
    public void keyTyped(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_RIGHT){
            RodLabel.setLocation(RodLabel.getX()+5,RodLabel.getY());
            System.out.println("R");
        }
        if (e.getKeyCode()==KeyEvent.VK_LEFT){
            RodLabel.setLocation(RodLabel.getX()-5,RodLabel.getY());
            System.out.println("L");
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_D){
            RodLabel.setLocation(RodLabel.getX()+5,RodLabel.getY());
            System.out.println("R");
        }
        if (e.getKeyCode()==KeyEvent.VK_A){
            RodLabel.setLocation(RodLabel.getX()-5,RodLabel.getY());
            System.out.println("L");
        }

    }
}

  • Вопрос задан
  • 75 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽