代码之家  ›  专栏  ›  技术社区  ›  NullPointerException

在Mouse Down事件中启动“asyncExec”会导致阻塞行为

  •  1
  • NullPointerException  · 技术社区  · 7 年前

    有一个“下一步”按钮,当我按下键盘输入键并选中按钮时,buton的widgetSelected事件被反复调用一次又一次,并执行一个超快速的next。这正是我想要的行为,但只发生在键盘输入键。我想有这样的行为与鼠标点击时,举行点击。当尝试用鼠标点击做同样的事情时,行为是不一样的,它只进行一个事件调用,当点击结束时(结束)。

    我尝试过这样做,但它阻止了用户界面(不明白为什么) 而且从来没有人叫过穆塞普 ,它永远堵在 while

        button.addMouseListener(new MouseAdapter() {
            boolean mouseDown;
            @Override
            public void mouseDown(MouseEvent e) {
                System.out.println("mouseDown");
                mouseDown = true;
                Display.getDefault().asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        while (mouseDown) {
                            System.out.println("Doing next in mouseDown");
                            next(composite, label_1);
                            synchronized(this){
                                try {
                                    wait(100);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                });
    
            }
            @Override
            public void mouseUp(MouseEvent e) {
                System.out.println("mouseUp");
                mouseDown = false;
            }
        }); 
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   greg-449    7 年前

    这个 Runnable 你给 asyncExec 在UI线程中运行。你必须 从未 在UI线程中执行任何类型的等待,因为这将阻止UI直到它完成。

    readAndDispatch

    而是使用 timerExec 方法 Display 安排 可运行的 在给定的时间间隔后跑。这个runnable应该执行操作的一个步骤并使用 以后再安排下一步。

        2
  •  1
  •   BogdanAdrian102    7 年前

    我记得几天前还有一个关于长时间鼠标点击行为的问题,但我再也找不到了。在我尝试在UI线程中使用asyncExec失败之后,我将这段基于greg-449解决方案的代码用于使用timerExec方法。:)

        button.addMouseListener(new MouseAdapter() {
            boolean mouseDown;
    
            @Override
            public void mouseDown(MouseEvent e) {
                mouseDown = true;
                Display.getCurrent().timerExec(1000, () -> {
                    if (mouseDown) {
                        button.notifyListeners(SWT.Selection, new Event());
                        button.notifyListeners(SWT.MouseDown, new Event());
                    }
                });
            }
    
            @Override
            public void mouseUp(MouseEvent e) {
                mouseDown = false;
            }
        });
    
        button.addSelectionListener(SelectionListener.widgetSelectedAdapter(
                e -> System.out.println("Do next")));