Как исправить KeyAdapter, больше не работающий, когда окно теряет фокус и снова получает его - PullRequest
0 голосов
/ 12 июня 2019

Я делаю простую игру на Java для школьного проекта и использую JFrame вместе с классом, расширяющим KeyAdapter, для прослушивания входных данных. Однако, как только я переключаю фокус на другое окно (такое как Snipping Tool), а затем снова на игровое окно, KeyAdapter больше не распознает нажатия клавиш.

Я пытался запустить этот код после компиляции, и в Eclipse оба раза возникала одна и та же проблема. Я использую Windows 10, если это имеет значение, и использую версию 4.11.0 Eclipse с последним доступным пакетом Java. Я не использовал JFrames и т. Д. В прошлом и нашел очень мало контента, описывающего их использование для начинающих.

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

public class GWindow extends Canvas {
    public GWindow() {
        frame = new JFrame("Dungeon120");
        frame.addKeyListener(new GInputs());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(1000, 650);
        frame.add(this);
        frame.pack();
        frame.setVisible(true);
        this.setBackground(Color.black);
    }
}
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class GInputs extends KeyAdapter {
    public void keyPressed(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.VK_SPACE) {
            Main.MainGame.TurnQueue.nextGUnit();
            System.out.println("SPACE KEY PRESSED");
        }
    }
}

Когда программа запускается в первый раз, она запускается, как и ожидалось, с пробелами нажимает «SPACE KEY PRESSED» и выполняет метод nextGUnit (). Однако после нажатия любой клавиши ничего не происходит, когда программа теряет и восстанавливает фокус.

1 Ответ

0 голосов
/ 13 июня 2019

Следует избегать смешивания компонентов AWT с компонентами Swing (в вашем случае Canvas с JFrame).В моем прошлом опыте использования KeyListener / KeyAdapter с JFrame и JPanel не работает.Вместо этого для прослушивания входных данных вы можете расположить JTextField за пределами экрана, чтобы прослушивать для вас ключи.

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

public class GWindow extends Canvas {
    public GWindow() {
        frame = new JFrame("Dungeon120");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(1000, 650);
        frame.add(this);
        JTextField listener = new JTextField();
        listener.addKeyListener(new GInputs());
        //add it to the frame using any layout of your choice
        this.add(listener);
        frame.pack();
        frame.setVisible(true);
        //set focus to JTextField
        listener.requestFocusInWindow();
        this.setBackground(Color.black);
    }
}

Если вы не знакомы с макетами, вот отрывок кода:

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

public class GWindow extends Canvas {
    public GWindow() {
        JFrame frame = new JFrame("Dungeon120");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //set layout to SpringLayout
        SpringLayout layout = new SpringLayout();
        frame.setLayout(new SpringLayout());
        this.setSize(1000, 650);
        frame.add(this);
        JTextField listener = new JTextField();
        listener.addKeyListener(new GInputs());
        //position it offscreen
        layout.putConstraint(SpringLayout.SOUTH, listener, 0, SpringLayout.NORTH, frame.getContentPane());
        frame.add(listener);
        frame.pack();
        frame.setVisible(true);
        //set focus to JTextField
        listener.requestFocusInWindow();
        this.setBackground(Color.black);
    }
}

Также попробуйте сделать свой JFrame вне конструктора GWindow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...