java - 关于java中无限期运行的小部件

标签 java memory swt clock

可选引用号 ( Regarding bulding gui and widgets in java )

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

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

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

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

最佳答案

对于您需要的时钟:

  • 用于显示时间的小部件(例如使用 PaintListener 绘制时钟的org.eclipse.swt.widgets.Canvas)
  • (守护进程)线程,每秒重绘您的时钟。重绘调用必须委托(delegate)给 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();
    }
}

关于java - 关于java中无限期运行的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18300372/

相关文章:

java - Maven 使用 Spring 构建和依赖注入(inject)

java - 使用 Java SWT 在透明图像上绘图

java - 在 Java 方法中使用标志的最佳实践

java - 正则表达式变音符号

Java 找不到我的 main

c++ - 尝试编译 MixKit 库时出错 (C++)

c++ - 在 32 位 XP 上分配超过 1 GB 的内存

c++ - 析构函数无法删除已分配的连续内存块

java - 进度条不会立即更新

java - 无法确定数组中的索引