使用 Eclipse 的 Java 中的计时器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7552596/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 17:03:03  来源:igfitidea点击:

Timer in java using Eclipse

javaeclipsetimer

提问by Lolo 60

I'm trying to do a little program in Java using Eclipse, and I'm a little bit lost.

我正在尝试使用 Eclipse 用 Ja​​va 编写一个小程序,但我有点迷茫。

Could anybody explain me (in a "for dummies way") what do I have to do for repaint a form using a timer?

任何人都可以解释我(以“傻瓜的方式”)我必须做什么才能使用计时器重新绘制表单?

I'm trying to do something as simple as a clock. I need a timer to repaint it every second.

我正在尝试做一些像时钟一样简单的事情。我需要一个计时器来每秒重新绘制它。

Something like this:

像这样的东西:

private void activateTimer()
{
    ActionListener myAction;
    myAction = new ActionListener () 
    { 
        public void actionPerformed(ActionEvent e) 
        { 
           whatever.redraw();
         } 

    };
    myTimer = new Timer(1000, myAction);
    myTimer.start();
}

When the action must be performed, I receive the error:

当必须执行操作时,我收到错误消息:

*Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access*

This is the full exception I receive:

这是我收到的完整例外:

Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access
    at org.eclipse.swt.SWT.error(SWT.java:4282)
    at org.eclipse.swt.SWT.error(SWT.java:4197)
    at org.eclipse.swt.SWT.error(SWT.java:4168)
    at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:359)
    at org.eclipse.swt.widgets.Control.redraw(Control.java:2327)
    at default.myTimer.actionPerformed(myTimer.java:97)
    at javax.swing.Timer.fireActionPerformed(Unknown Source)
    at javax.swing.Timer$DoPostEvent.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access
private void activateTimer(){
    myTimer = new Timer(1000, myAction);
    myTimer.start();
}

private Action myAction = new AbstractAction() {

    private static final long serialVersionUID = 1L;

    @Override
    public void actionPerformed(ActionEvent e) {
          whatever.redraw();
    }
};
0(Unknown Source) at java.awt.EventQueue.run(Unknown Source) at java.awt.EventQueue.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

Any idea or any sample about refreshing a screen every second?

关于每秒刷新屏幕的任何想法或任何示例?

I've followed the instructions in one of the answers but I'm still receiving the same error.

我已按照其中一个答案中的说明进行操作,但仍然收到相同的错误。

回答by mKorbel

you have to split that to the separete methods, better would be using javax.swing.Actioninstead of ActionListener

您必须将其拆分为单独的方法,最好使用javax.swing.Action而不是ActionListener

private void activateTimer(final Display display)
{
    display.timerExec(
        1000,
        new Runnable() {
            public void run() {
                whatever.redraw();
                // If you want it to repeat:
                display.timerExec(1000, this);
            }
        });
}

回答by slowhand

Why not use the timer functionality that is built into the SWT Display class?

为什么不使用内置在 SWT Display 类中的计时器功能呢?

Job job = new Job("My Job") {
@Override
protected IStatus run(IProgressMonitor monitor) {
    Display.getDefault().asyncExec(new Runnable() {
        @Override
        public void run() {
            while(true)
            {
                Thread.sleep(1000);
                whatever.redraw();
            }
        }
    });
    return Status.OK_STATUS;
}
};
job.schedule();

回答by yolgecad

This pagemay be useful.

此页面可能有用。

If you use SWT, do it in SWT way :)

如果您使用 SWT,请以 SWT 方式进行:)

EDIT:

编辑:

The problem is widget should be updated by eclipse's thread. Try this code.

问题是小部件应该由 eclipse 的线程更新。试试这个代码。

##代码##