Как вызвать focusListener несколько раз? - PullRequest
0 голосов
/ 04 февраля 2020

Я прочитал документы. oracle и другие веб-сайты, но не нашел решения для моей проблемы.

У меня есть класс (KeyboardObserver), где я создаю переменную фрейма Jframe, добавляю к нему focusListener и keyListener. Этот класс также имеет переменную KeyEvent, в которой хранится значение нажатой клавиши.

Когда я впервые создаю новый объект KeyboardObserver в другом классе, все в порядке, но после потери фокуса и создания нового объекта KeyboardObserver фокус не достигается.

Что я делаю не так? Заранее спасибо:)

public static boolean tryItAgain() {
    System.out.println("\n"+"to continue - press Space button, to exit - press any other button.");
    KeyboardObserver kO = new KeyboardObserver();
    kO.addListeners();
    while (kO.getEvent()==null){ }
    int temp = kO.getEvent().getKeyCode();
    System.out.println("test " + temp);
    kO.turnDownFrame();
    return temp==KeyEvent.VK_SPACE;
}

Вот класс KeyboardObserver:

public class KeyboardObserver {
private KeyEvent event;
private JFrame frame;

public KeyboardObserver(){
    System.out.println("test: creation started");
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setUndecorated(true);
    frame.setSize(300,300);
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setOpacity(0f);
    frame.setVisible(true);

    System.out.println("test: fields initialized");
}
public void addListeners(){
    System.out.println("addListener started");
    frame.addFocusListener(new FocusListener() {
        @Override
        public void focusGained(FocusEvent e) {
            System.out.println("gained");
        }

        @Override
        public void focusLost(FocusEvent e) {
            System.out.println("lost");
        }
    });

    frame.addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) { }

        @Override
        public void keyPressed(KeyEvent e) {
            event = e;
            System.out.println("key pressed");
        }

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

public KeyEvent getEvent() {
    return event;
}

public void turnDownFrame(){
    frame.dispose();
}
}
...