Я тут довел пример до логического конца. Если 10 секунд ничего не делать, то на консоль будет выкидываться сообщение "Start ScreenSaver". Если что-то нажать, то вывод прекратится.
Код | import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame;
public class ScreenSaverManager { public static final long AWT_EVENT_MASK = AWTEvent.MOUSE_WHEEL_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK | AWTEvent.KEY_EVENT_MASK; protected long startDelay; private Toolkit toolkit; private long lastUserActionTime; private AWTEventListener listener; private StartTask startTask; private Timer sheduleTimer; private boolean alreadyRegistered = false;
public ScreenSaverManager(long startDelay) throws AWTException { if(startDelay <= 0) throw new IllegalArgumentException("Start delay must be > 0");
this.startDelay = startDelay; this.listener = new KeyMouseListener(); this.toolkit = Toolkit.getDefaultToolkit(); sheduleTimer = new Timer(true); }
public synchronized void register() { if(!alreadyRegistered) { toolkit.addAWTEventListener(listener, AWT_EVENT_MASK); listener.eventDispatched(null);
if(startTask != null) startTask.cancel(); startTask = new StartTask(); sheduleTimer.schedule(startTask, 1000, 1000); } }
public synchronized void unregister() { toolkit.removeAWTEventListener(listener); alreadyRegistered = false; startTask.cancel(); startTask = null; }
public long getStartDelay() { return startDelay; }
public void setStartDelay(long startDelay) { this.startDelay = startDelay; }
private class KeyMouseListener implements AWTEventListener { public void eventDispatched(AWTEvent event) { lastUserActionTime = System.currentTimeMillis(); } }
private class StartTask extends TimerTask { public void run() { if( (System.currentTimeMillis() - lastUserActionTime) > startDelay) { System.out.println("Start ScreenSaver"); } } }
public static void main(String[] args) { ScreenSaverManager ssm; try { ssm = new ScreenSaverManager(10000); ssm.register(); } catch(Exception e) { e.printStackTrace(); System.exit(0); } JFrame f = new JFrame(); f.setBounds(100,100,500,500); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
| |