1

我有一个名为todoList

当用户单击列表中的某个项目时,它会保持选中状态。但是我希望列表中当前选定的项目在鼠标退出 jList 400 毫秒后取消选择“自行”。

仅当列表中已选择某些内容时才必须运行。

我正在使用 Netbeans IDE,这是迄今为止尝试过的:

private void todoListMouseExited(java.awt.event.MouseEvent evt) {                                     
    if (!todoList.isSelectionEmpty()) {
        Thread thread = new Thread();
        try {
            thread.wait(400L);
            todoList.clearSelection();
        } catch (InterruptedException ex) {
            System.out.println(ex);
        }
    }
}

 private void todoListMouseExited(java.awt.event.MouseEvent evt) {                                     
    if (!todoList.isSelectionEmpty()) {
        Thread thread= Thread.currentThread();
        try {
            thread.wait(400L);
            todoList.clearSelection();
        } catch (InterruptedException ex) {
            System.out.println(ex);
        }
    }
}

这些都只是让一切都停止工作。

我的过程是我需要创建一个等待 400 毫秒的新线程,然后运行 ​​jList 的 clearSelection() 方法。每次鼠标退出列表时都会发生这种情况,并且仅当列表中有已被选中的内容时才会运行。

我希望我足够彻底地解释我的问题。

4

2 回答 2

4

问题是您阻塞了 AWT-Event-Thread。

解决方案是使用摇摆计时器

private void todoListMouseExited(java.awt.event.MouseEvent evt) 
{
   if (!todoList.isSelectionEmpty()) {
        new Timer(400, new ActionListener() {
              public void actionPerformed(ActionEvent evt) {
                  todoList.clearSelection();
              }
        }).start();
    }
}
于 2013-04-08T20:32:06.493 回答
3

问题是Object#wait正在等待(而不是sleep)被通知,但这并没有发生。相反,超时导致InterruptedException绕过对clearSelection.

不要ThreadsSwing应用程序中使用 raw。而是使用Swing Timer旨在与 Swing 组件交互的 a。

if (!todoList.isSelectionEmpty()) {
   Timer timer = new Timer(400, new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
         todoList.clearSelection();
      }
   });
   timer.setRepeats(false);
   timer.start();
}
于 2013-04-08T20:26:55.880 回答