JavaSwingJFrame突然停止响应鼠标输入,但仍然接受键盘输入

JavaSwingJFrame突然停止响应鼠标输入,但仍然接受键盘输入,java,swing,jframe,Java,Swing,Jframe,我有一个使用JFrame显示游戏信息的游戏。每当玩家向服务器发送移动对象时,窗口就会更新。对于任何数量的移动对象,它都可以正常工作。然而,一旦第三次转弯开始,它就会撞到墙上,下面是发生的情况: Jframe完全停止对鼠标左键和右键单击的响应(当您尝试单击时,它会发出windows叮当声) JFrame仍然响应鼠标滚动和键盘输入 JFrame将从alt tab程序列表中消失 没有错误消息或堆栈跟踪 使用souts,代码似乎正确地到达了所有必要的代码点 我甚至无法单击“X”窗口按钮或右键单击任务栏

我有一个使用JFrame显示游戏信息的游戏。每当玩家向服务器发送移动对象时,窗口就会更新。对于任何数量的移动对象,它都可以正常工作。然而,一旦第三次转弯开始,它就会撞到墙上,下面是发生的情况:

  • Jframe完全停止对鼠标左键和右键单击的响应(当您尝试单击时,它会发出windows叮当声)
  • JFrame仍然响应鼠标滚动和键盘输入
  • JFrame将从alt tab程序列表中消失
  • 没有错误消息或堆栈跟踪
  • 使用souts,代码似乎正确地到达了所有必要的代码点
  • 我甚至无法单击“X”窗口按钮或右键单击任务栏上的“关闭”
  • 第三个转弯对象在结构上与前一个转弯对象相同
到底是什么导致程序这样做的呢?

程序抛出了一个异常。它会自动重新启动,但程序仍保持您描述的状态。另请参见和此

增编:也许会有帮助。还要检查是否有空的异常处理程序

附录:这里有一个例子

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();
            }
        });
    }
}
服务器抛出了一个异常。它会自动重新启动,但程序仍保持您描述的状态。另请参见和此

增编:也许会有帮助。还要检查是否有空的异常处理程序

附录:这里有一个例子

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();
            }
        });
    }
}

检查框架类是否未重写isEnabled()方法。
我花了几个小时搜索异常,但响应非常简单:我已经用这样的方法实现了接口。

检查您的框架类是否没有重写isEnabled()方法。
我花了几个小时搜索异常,但响应非常简单:我已经用这种方法实现了接口。

发布一个sscce,我认为我做不到(我知道这会让帮助我非常困难)。我真正想知道的是,是否有人知道这样的事情是如何在不引起堆栈跟踪的情况下可预测地发生的。然后也许我可以找到问题。某个模态对话框会在后台,不属于你的JFrame?通过暂停EDT并查看stacktrace,使用调试器可能会有所帮助?你也可以使用JConsole来实现这一点。我想你可能已经了解了一些事情,因为我的任务栏上偶尔会显示一个奇怪的任务,但我无法单击或查看它。发布一个sscce,我认为我做不到(我知道这将使帮助我变得非常困难)。我真正想知道的是,是否有人知道这样的事情是如何在不引起堆栈跟踪的情况下可预测地发生的。然后也许我可以找到问题。某个模态对话框会在后台,不属于你的JFrame?通过暂停EDT并查看stacktrace,使用调试器可能会有所帮助?你也可以使用JConsole来实现这一点。我想你可能了解了一些事情,因为有时候我的任务栏上会显示一个奇怪的任务,但我无法单击它或查看它。我使用了链接中的“MyExceptionHandler”示例,并在main中注册了它。当问题发生时,什么也没有出现。哎哟。接下来,我将查找空的异常处理程序。您正在使用吗?我使用了链接中的“MyExceptionHandler”示例,并在main中注册了它。当问题发生时,什么也没有出现。哎哟。接下来,我会查找空的异常处理程序。您正在使用吗?