прокатка представляет собой серию дискретных движений, так что вы будете иметь, чтобы решить, сколько времени между дискретными движениями означает «остановлены», а затем с помощью 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 мс, то уведомление может быть нервным, когда колесо поворачивается медленно.
roll - это серия дискретных движений, поэтому вам нужно будет решить, сколько времени между дискретными движениями означает «остановлено», а затем использовать таймер Swing для проверки этого приращения времени. –
Нет. Мне бы хотелось узнать, когда пользователь перестает прокручивать колесико мыши в течение длительного периода времени. – Oak
Возможно, я не проясняю и сожалею об этом. Но подумайте о секунде пользователя, который прокручивается очень медленно. Если медленный скроллер перемещает свое колесо мыши каждую секунду, когда он действительно останавливается? Опять же, я думаю, что вам нужно будет решить какой-то произвольный временной срез, запустите некоторый таймер, когда пользователь переместит колесико мыши, и отмените тот же таймер, когда они снова будут использовать колесо до того, как срез будет вверх. –