0

可选参考(关于构建 gui 和 java 中的小部件

如这里所说,我正在制作一个简单的时钟小部件。我选择 SWt 是因为我发现它更容易学习和实施。小部件由几层同心圆组成,为每一层赋予不同的颜色。每层的颜色取决于一天中的时间,并由颜色函数控制。图层已准备就绪,但仍需要制作颜色功能。

我正在浏览 Java 文档,发现所有图形对象(如矩形和圆形)都必须手动处理以释放系统资源。现在我的基本问题是:

基本上我希望小部件无限期地运行,直到包含小部件的窗口关闭(因为有一个分钟层和小时层会改变颜色)。我将如何释放系统资源,小部件是否会成为无限的内存怪物?请参考Swt回答。

另外我想知道这个动画策略的tyoe是否适合这个小部件?如果没有,请记住我的初学者水平建议其他替代方案。

4

1 回答 1

1

对于您需要的时钟:

  • 显示时间的小部件(例如org.eclipse.swt.widgets.Canvas用 aPaintListener来绘制时钟)
  • 每秒重绘时钟的(守护进程)线程。重绘调用必须委托给EDT(事件调度线程)

只要您的小部件未处置,该线程就应该运行。要在处理小部件时清理任何资源(字体、颜色等),请使用DisposeListener.

代码模板:

public class ClockWidget extends Canvas {

    public ClockWidget (Composite parent, int style) {
        super(parent, style | SWT.DOUBLE_BUFFERED);

        addPaintListener(new PaintListener() {

            @Override
            public void paintControl (PaintEvent e) {
                GC gc = e.gc;
                // paint clock on the graphics context
            }
        });
        addDisposeListener(new DisposeListener() {

            @Override
            public void widgetDisposed (DisposeEvent e) {
                // dispose all fonts and colors you created
            }
        });

        final Display display = Display.getCurrent();
        Thread timer = new Thread() {

            @Override
            public void run () {
                while (!isDisposed()) {
                    display.syncExec(new Runnable() {

                        @Override
                        public void run () {
                            if (!isDisposed()) {
                                redraw();
                            }
                        }
                    });
                    long msToNextSec = 1000 - (System.currentTimeMillis() % 1000);
                    try {
                        Thread.sleep(msToNextSec);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        timer.setPriority(Thread.MIN_PRIORITY);
        timer.setDaemon(true);
        timer.start();
    }
}
于 2013-08-21T12:56:09.720 回答