KeyListener работает в случайном порядке в JFrame - PullRequest
0 голосов
/ 08 октября 2018

Каждый раз, когда я запускаю свое приложение, это монета, независимо от того, будет ли KeyListener работать.Если это работает, у него не будет проблем в любой момент после этого, но если он не будет работать в начале приложения, он никогда не будет работать, пока программа не закроется и не запустится снова.

public ThreeDimChessRunner() {
    record = new ArrayList<Integer>();
    winner = Player.NONE;
    game = new ThreeDimBoard(0);
    addMouseListener(this);
    addKeyListener(this);
    setFocusable(true);

    tm.start();
    screenWidth = screenSize.width;
    screenHeight = screenSize.height;
}

public static void main(String[] args){
    screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    ThreeDimChessRunner p = new ThreeDimChessRunner();
    JFrame frame = new JFrame("3D Chess");  
    frame.setExtendedState(Frame.MAXIMIZED_BOTH);
    frame.setUndecorated(true);

    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(p);
}

Класс ThreeDimChessRunner расширяет JPanel и реализует KeyListener, ActionListener и MouseInputListener.

tm является Timer объектом

screenSize являетсяDimension объект

1 Ответ

0 голосов
/ 08 октября 2018

Компоненты должны быть добавлены в кадр ДО того, как кадр станет доступным.

Фокус не может быть придан компоненту, если компонент не был добавлен во фрейм, а KeyListener работает только с компонентами, которые имеют фокус.

Случайные результаты обычно появляются, потому что выНЕ создает графический интерфейс на Event Dispatch Thread (EDT).Все компоненты Swing и обновления компонентов Swing должны выполняться на EDT.Прочтите раздел Concurrency для получения дополнительной информации и примера правильного способа создания вашего GUI.

Кроме того, вы не должны использовать KeyListener для прослушивания событий.Как вы заметили, они ненадежны, поскольку зависят от компонента, имеющего фокус.Вместо этого вы должны использовать Key Bindings .Их можно настроить на работу, даже если у компонента нет фокуса.

...