Примечание: Поскольку вы не упомянули операционную систему, поэтому я смело принимаю ее как Windows (потому что это то, что у меня есть).
Ответ
Если вы внимательно посмотрите на класс org.eclipse.swt.widgets.Widget
, то обнаружите, что TypedEvent.time
инициализируется следующим образом:
event.time = display.getLastEventTime ();
Который в ответ звонит: OS.GetMessageTime ();
Теперь SWT
напрямую работает с виджетами ОС , поэтому на машине с Windows вызов OS.GetMessageTime ();
напрямую переводится в Windows GetMessageTime API.
Проверьте GetMessageTime на MSDN . Согласно странице:
Извлекает время сообщения для
последнее сообщение, полученное
Функция GetMessage. Время
длинное целое число, которое определяет
прошедшее время, в миллисекундах, с
время, когда система была запущена
время создания сообщения (то есть
помещается в очередь сообщений цепочки).
Обратите особое внимание на строку from the time the system was started to the time the message was created
, что означает, что это не стандарт System.currentTimeMillis()
, который представляет собой истекшее время в миллисекундах с 1 января 1970 года.
Кроме того, для расчета задержек между
сообщения, убедитесь, что время
второе сообщение больше, чем
время первого сообщения; затем,
вычесть время первого сообщения
со времени второго сообщения.
См. Пример кода ниже, который печатает два разных сообщения за время меньше 5 секунд и больше 5 секунд. ( Примечание: Следует отметить, что таймер запускается с первого события. Таким образом, вычисление всегда относительно относительно первого события). Из-за своего относительного характера TypedEvent.time
может не подходить для ваших целей, так как первое событие может наступить очень поздно.
>> Код
import java.util.Calendar;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class ControlF
{
static Calendar first = null;
public static void main(String[] args)
{
Display display = new Display ();
final Shell shell = new Shell (display);
shell.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e)
{
long eventTime = (e.time&0xFFFFFFFFL) ;
if(first == null)
{
System.out.println("in");
first = Calendar.getInstance();
first.setTimeInMillis(eventTime);
}
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(eventTime);
long dif = (cal.getTimeInMillis() - first.getTimeInMillis())/1000;
if( dif <= 5)
{
System.out.println("Within 5 secs [" + dif + "]");
}else
System.out.println("Oops!! out of 5 second range !!");
}
});
shell.setSize (200, 200);
shell.open ();
while (!shell.isDisposed()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
}