Java Swing JFrame внезапно перестает отвечать на ввод с помощью мыши, но все равно принимает ввод с клавиатуры - PullRequest
1 голос
/ 30 марта 2012

У меня есть игра, в которой используется JFrame, отображающий информацию об игре. Окно обновляется всякий раз, когда игрок отправляет объект перемещения на сервер. Он отлично работает для любого количества движущихся объектов. Однако, как только начинается третий ход, он попадает в стену, и вот что происходит:

  • Jframe полностью перестает реагировать на щелчки левой и правой мышью (при попытке щелкать звук Windows)
  • JFrame по-прежнему реагирует на прокрутки мыши и ввод с клавиатуры
  • JFrame исчезает из списка программ alt-tab.
  • НЕТ сообщения об ошибке или трассировки стека.
  • Используя souts, кажется, что код правильно достигает всех точек необходимого кода
  • Я даже не могу нажать кнопку окна "X" или щелкнуть правой кнопкой мыши на панели задач
  • Объект 3-го хода конструктивно идентичен объектам предыдущего хода

Что может заставить программу сделать это ??

Ответы [ 2 ]

4 голосов
/ 30 марта 2012

Поток отправки событий выдал исключение.Он автоматически перезапускается, но ваша программа остается в том состоянии, которое вы описали.См. Также Как я могу поймать исключения потока рассылки событий (EDT) и этот ответ .

Приложение: Какнеобработанные исключения обрабатываются и Неопределенные исключения в приложениях с графическим интерфейсом могут быть полезны.Также проверьте наличие пустых обработчиков исключений.

Добавление: Вот пример.

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

/** @see https://stackoverflow.com/a/9935287/230513 */
public class Fail extends JPanel {

    private static final JLabel label = new JLabel(
        "12345678901234567890", JLabel.CENTER);

    public Fail() {
        this.setLayout(new GridLayout(0, 1));
        this.add(label);
        this.add(new JButton(new AbstractAction("Kill me, now!") {

            @Override
            public void actionPerformed(ActionEvent e) {
                JButton b = (JButton) e.getSource();
                b.setText(String.valueOf(1 / 0));
            }
        }));
        new Timer(100, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText(String.valueOf(System.nanoTime()));
            }
        }).start();
    }

    private void display() {
        JFrame f = new JFrame("Example");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Fail().display();
            }
        });
    }
}
0 голосов
/ 28 октября 2018

Проверьте, не переопределяет ли ваш класс кадров метод isEnabled (). Я потратил пару часов на поиск исключения, но реакция была довольно тривиальной: я реализовал интерфейс с таким методом.

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