可选引用号 ( 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/