2015-08-16 1 views
0

Я создаю простую программу, и мне нужно получить логическое значение false, когда колесо мыши пользователя перестает прокручиваться. Мой код ниже с дополнительной информацией.Обнаружение колесиков мыши

public class WheelHandler extends MouseAdapter { 

    public void mouseWheelMoved(MouseWheelEvent e) { 
     moved = e.getWheelRotation(); 
     scrolling = true; 
    } 

    scrolling = false; // How do I make this run when the wheel becomes stopped? 
} 
+1

roll - это серия дискретных движений, поэтому вам нужно будет решить, сколько времени между дискретными движениями означает «остановлено», а затем использовать таймер Swing для проверки этого приращения времени. –

+0

Нет. Мне бы хотелось узнать, когда пользователь перестает прокручивать колесико мыши в течение длительного периода времени. – Oak

+2

Возможно, я не проясняю и сожалею об этом. Но подумайте о секунде пользователя, который прокручивается очень медленно. Если медленный скроллер перемещает свое колесо мыши каждую секунду, когда он действительно останавливается? Опять же, я думаю, что вам нужно будет решить какой-то произвольный временной срез, запустите некоторый таймер, когда пользователь переместит колесико мыши, и отмените тот же таймер, когда они снова будут использовать колесо до того, как срез будет вверх. –

ответ

1

прокатка представляет собой серию дискретных движений, так что вы будете иметь, чтобы решить, сколько времени между дискретными движениями означает «остановлены», а затем с помощью Swing, таймер для проверки этого шага приращения времени. Вам нужно будет решить какой-то произвольный срез времени (ниже его int TIMER_DELAY = 100 или 100 мс), запустите некоторый таймер, когда пользователь переместит колесо мыши, и отмените тот же таймер, когда они снова будут использовать колесо, прежде чем срез будет поднят.

Например:

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseWheelEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class NotifyWheelStopped extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 
    private static final String WHEEL_STOPPED = "Wheel has stopped"; 
    private static final String WHEEL_MOVING = "Wheel is moving"; 
    public static final int TIMER_DELAY = 100; 
    private JLabel notificationLabel = new JLabel(WHEEL_STOPPED, SwingConstants.CENTER); 
    private WheelHandler wheelHandler = new WheelHandler(); 
    private Timer wheelMovementTimer; 

    public NotifyWheelStopped() { 
     add(notificationLabel); 
     addMouseWheelListener(wheelHandler); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class WheelHandler extends MouseAdapter { 
     @Override 
     public void mouseWheelMoved(MouseWheelEvent e) { 
      notificationLabel.setText(WHEEL_MOVING); 
      if (wheelMovementTimer != null && wheelMovementTimer.isRunning()) { 
       wheelMovementTimer.stop(); 
      } 
      wheelMovementTimer = new Timer(TIMER_DELAY, new WheelMovementTimerActionListener()); 
      wheelMovementTimer.setRepeats(false); 
      wheelMovementTimer.start(); 
     } 
    } 

    private class WheelMovementTimerActionListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      notificationLabel.setText(WHEEL_STOPPED); 
     } 
    } 

    private static void createAndShowGui() { 
     NotifyWheelStopped mainPanel = new NotifyWheelStopped(); 

     JFrame frame = new JFrame("NotifyWheelStopped"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 

Даже с задержкой 100 мс, то уведомление может быть нервным, когда колесо поворачивается медленно.