在一段时间不活动后关闭 SWT 应用程序
Closing a SWT application after certain time of inactivity
我试图在一段时间不活动后关闭 SWT 应用程序。我发现很难计算我尝试过的不活动状态 period.All 只是在指定的时间后关闭应用程序,无论我是否仍在处理该应用程序。
下面是我试过的代码
Timer timer = new Timer();
display.asyncExec(new Runnable(){
public void run() {
while(!shell.isDisposed()){
if (!display.readAndDispatch()){ //if the system is idle
timer.schedule(new TimerTask() { //schedule timer which will trigger after 1min.
@Override
public void run() {
logout();
}
}, 60000);
}
else{ // reschedule the timer
timer.cancel();
Timer timer = new Timer();
}
}
}
});
有了这个,即使用户正在执行某些操作,我也只能在 1 分钟后注销。有没有一种方法可以检查 SWT 中的不活动时间?
您可以使用 Display.addFilter
来侦听使应用 'active' 发生的各种事件。在 UI 线程中重复使用 Display.timerExec
到 运行 代码来检查自上次事件以来的时间。
可能是这样的:
private Instant lastActive;
....
lastActive = Instant.now();
final Listener listener = new Listener()
{
@Override
public void handleEvent(final Event event)
{
lastActive = Instant.now();
}
};
display.addFilter(SWT.MouseMove, listener);
display.addFilter(SWT.KeyDown, listener);
// TODO more filters if required
final Runnable timer = new Runnable()
{
@Override
public void run()
{
final Instant now = Instant.now();
if (ChronoUnit.SECONDS.between(lastActive, now) > xxx) { // Number of inactive seconds here
System.out.println("inactive"); // Inactive code here
}
else {
display.timerExec(1000, this);
}
}
};
display.timerExec(1000, timer);
... create/open shell ...
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
我试图在一段时间不活动后关闭 SWT 应用程序。我发现很难计算我尝试过的不活动状态 period.All 只是在指定的时间后关闭应用程序,无论我是否仍在处理该应用程序。
下面是我试过的代码
Timer timer = new Timer();
display.asyncExec(new Runnable(){
public void run() {
while(!shell.isDisposed()){
if (!display.readAndDispatch()){ //if the system is idle
timer.schedule(new TimerTask() { //schedule timer which will trigger after 1min.
@Override
public void run() {
logout();
}
}, 60000);
}
else{ // reschedule the timer
timer.cancel();
Timer timer = new Timer();
}
}
}
});
有了这个,即使用户正在执行某些操作,我也只能在 1 分钟后注销。有没有一种方法可以检查 SWT 中的不活动时间?
您可以使用 Display.addFilter
来侦听使应用 'active' 发生的各种事件。在 UI 线程中重复使用 Display.timerExec
到 运行 代码来检查自上次事件以来的时间。
可能是这样的:
private Instant lastActive;
....
lastActive = Instant.now();
final Listener listener = new Listener()
{
@Override
public void handleEvent(final Event event)
{
lastActive = Instant.now();
}
};
display.addFilter(SWT.MouseMove, listener);
display.addFilter(SWT.KeyDown, listener);
// TODO more filters if required
final Runnable timer = new Runnable()
{
@Override
public void run()
{
final Instant now = Instant.now();
if (ChronoUnit.SECONDS.between(lastActive, now) > xxx) { // Number of inactive seconds here
System.out.println("inactive"); // Inactive code here
}
else {
display.timerExec(1000, this);
}
}
};
display.timerExec(1000, timer);
... create/open shell ...
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}