【问题标题】:Java Swing JFrame suddenly stops responding to mouse input, but still takes keyboard inputsJava Swing JFrame 突然停止响应鼠标输入,但仍接受键盘输入
【发布时间】:2018-10-28 19:31:16
【问题描述】:

我有一个使用显示游戏信息的 JFrame 的游戏。每当玩家向服务器发送移动对象时,窗口就会更新。它适用于任意数量的移动对象。然而,一旦第 3 回合开始,它就会撞到墙上,会发生以下情况:

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

到底是什么导致程序这样做??

【问题讨论】:

  • 发布一个 sscce sscce.org
  • 我觉得我做不到(我知道这会让我很难帮上忙)。我真正想知道的是,是否有人知道这样的事情是如何在不引起堆栈跟踪的情况下发生的。那么也许我可以找到问题。
  • 一些模态对话框会在后台,不属于你的 JFrame?使用调试器可能有助于暂停 EDT 并查看堆栈跟踪?你也可以使用 JConsole 来做到这一点
  • 我认为您可能正在做某事,因为有时我的任务栏上会显示一个奇怪的任务,但我无法单击或查看它。

标签: java swing jframe


【解决方案1】:

event dispatch thread 已引发异常。它会自动重新启动,但您的程序仍处于您描述的状态。另请参阅How can I catch Event Dispatch Thread (EDT) exceptions 和此answer

附录:How uncaught exceptions are handledUncaught exceptions in GUI applications 可能会有所帮助。还要检查空异常处理程序。

附录:这是一个例子。

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

【讨论】:

  • 我使用了您链接中的“MyExceptionHandler”示例并在 main.xml 中注册了它。当问题发生时,什么都没有出现。
  • 哎哟。接下来我会寻找空的异常处理程序。
【解决方案2】:

检查您的框架类是否不覆盖 isEnabled() 方法。 我花了几个小时寻找异常,但响应很简单:我已经用这种方法实现了接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多