Question

I have a jList called todoList

When the user click on an item in the list, it stays selected. But I would like the currently selected item in the list to deselect "by itself" after 400 milliseconds when the mouse exits the jList.

This must only run if there is something already selected in the list.

I am using Netbeans IDE and this is what is have tried so far:

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

and

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

These both just make everything stop working.

My though process was that i need to create a new Thread that will wait for 400 milliseconds and then run the clearSelection() method of the jList. This would happen every time the mouse exits the list and run only if there is something in the list that is already selected.

I hope I am explaining my problem thoroughly enough.

Was it helpful?

Solution 2

The problem is that Object#wait is waiting(rather than sleeping) to be notified but this is not happening. Instead the timeout causing an InterruptedException bypassing the call to clearSelection.

Don't use raw Threads in Swing applications. Instead use a Swing Timer which was designed to interact with Swing components.

if (!todoList.isSelectionEmpty()) {
   Timer timer = new Timer(400, new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
         todoList.clearSelection();
      }
   });
   timer.setRepeats(false);
   timer.start();
}

OTHER TIPS

The problem is that you are blocking the AWT-Event-Thread.

The solution is to use a swing timer:

private void todoListMouseExited(java.awt.event.MouseEvent evt) 
{
   if (!todoList.isSelectionEmpty()) {
        new Timer(400, new ActionListener() {
              public void actionPerformed(ActionEvent evt) {
                  todoList.clearSelection();
              }
        }).start();
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top