2015-10-28 2 views
0

У меня есть JLabel, и я использую на нем MouseListener. Я использую известный код:MouseListener задерживает бит mouseEntered

jl.addMouseListener(new MouseAdapter() { 
    public void mouseEntered(MouseEvent me) { 
     System.out.println("Entered") 
    } 
}); 

И текст Entered печатается, когда я вхожу мышью на JLabel. Все в порядке, но я хотел бы существовать немного задержки (например, 1-2 секунды) к моменту ввода курсора на JLabel, а затем текст для печати. Как я могу это сделать? Большое спасибо

+0

Возможно дубликат [Как я могу задержать MouseOver в Java?] (Http://stackoverflow.com/questions/8187801/how-can-i- delay-a-mouseover-in-java) – Frakcool

+1

Вы можете использовать javax.swing.Timer. См. Примеры того, как вы можете использовать его [здесь] (http://stackoverflow.com/questions/13691339/adding-a-timer-and-displaying-label-text/13691413#13691413) –

+0

Зачем вам нужно отображать текст когда мышь входит в ярлык? Решение будет зависеть от кода, который должен быть выполнен в MouseListener. – camickr

ответ

2

Учитывая единообразный характер API Swing и тот факт, что API не является потокобезопасным, я бы рекомендовал использовать Swing Timer для ввода небольшой задержки между событием и вашей операцией, например ...

Timer timer = new Timer(1000, new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent evt) { 
     //... 
    } 
}); 
timer.setRepeats(false); // So you are notified only once per mouseEnter event 

jl.addMouseListener(new MouseAdapter() { 
    public void mouseEntered(MouseEvent me) { 
     timer.restart(); 
    } 
}); 

Этот пример задержит призвание ActionListener на 1 каждый раз, когда второй мыши вызывает mouseEntered событие. Обратите внимание, что если пользователь выходит и вводит метку до истечения срока задержки, он будет возвращен к началу.

Если вы хотите какое-то событие, чтобы вызвать 1 секунду после ЛЮБОГО mouseEnter события, то можно было бы просто создать новый свинг Timer на каждом mouseEnter случае вместо этого.

Взгляните на Concurrency in Swing и How to use Swing Timers для получения более подробной информации

1

Используйте ScheduledExecutorService

Где-то в вашей программе, вам нужно создать:

final ScheduledExecutorService svc = Executors.newScheduledThreadPool(1); 

Затем в слушателе мыши запланировать задачу:

jl.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mouseEntered(MouseEvent me) { 
     svc.schedule(new Runnable() { 
      @Override 
      public void run() { System.out.println("Entered"); } 
     }, 2, TimeUnit.SECONDS); 
    } 
}); 

Я отделит некоторые из функциональных возможностей для методов, вызываемых анонимными внутренними классами. Вложение анонимных внутренних классов, подобных этому, может быстро привести к трудно читаемому и трудноподдерживающемуся коду.

Смежные вопросы