【问题标题】:Mouse event wait freezes when called from button从按钮调用时鼠标事件等待冻结
【发布时间】:2012-06-01 18:30:09
【问题描述】:

我有一个方法可以显示一个透明的窗口覆盖,这样我就可以通过点击来指示一个矩形屏幕区域的角点。

public Point getClickPoint(){
        JFrame frame = new JFrame("");
        MyMouseListener mouseL = new MyMouseListener();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);
        makeTranslucent(frame, Float.valueOf(0.40f));
        frame.setSize(toolkit.getScreenSize());
        frame.setVisible(true);

      frame.addMouseListener(mouseL);
        while(!mouseL.done){
            try {
                Thread.sleep(4);
                } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
 }

当我以正常方式调用它时,它工作正常,但如果我按下按钮调用它,它就会挂起,不记录点击并最终冻结。

 Button.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent actionEvent) {
        getClickPoint();
    }
}

这是否与它最初由动作侦听器调用的事实有关?

【问题讨论】:

    标签: java multithreading swing awt sleep


    【解决方案1】:

    您正在阻止Event Dispatch Thread。由于将在 EDT 上调用 actionPerformed 方法,因此 getClickPoint 中的 while 循环将阻止 EDT 处理任何事件(包括您正在等待的鼠标事件),从而导致您的程序无响应。

    如果您需要执行耗时的任务(例如阻塞),请查看SwingWorker

    【讨论】:

    • 这是 Swing Timer 的专属工作
    • 所以我创建了一个名为GetPointWorker 的类,它扩展了SwingWorker,其doInBackground() 的任务如上。我的方法现在实例化一个新的GetPointWorker 并调用doInBackground(),但它仍然冻结。我的结构是否非常错误?
    • @skelly 你不直接打电话给doInBackground。你打电话给executedoInBackground 最终会被一个单独的Thread 调用。
    猜你喜欢
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2014-02-07
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多