我有时需要在 SWT 中动态生成颜色。以一个视图为例,该视图以红绿色的不同颜色显示 0-1 之间的分数。可能还有其他不同颜色的类似视图:
class ScoreView {
private Canvas canvas;
private List<Item> items = new ArrayList<Item>();
public ScoreView(Composite parent) {
canvas = new Canvas(parent, SWT.NONE);
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent event) {
GC gc = event.gc;
int x = 0;
for(Item item:items) {
int shade = (int)(item.getScore() * 255.0);
Color color = new Color(Display.getCurrent(), shade, 255-shade, 0);
gc.setBackground(color);
gc.fillRectangle(x, 0, 50, 50);
x += 50;
}
}
});
}
public void setItems(List<Item> items) {
this.items = items;
canvas.redraw();
}
}
在 SWT 中,您应该始终释放资源。来自http://www.eclipse.org/articles/Article-SWT-Color-Model/swt-color-model.htm:
颜色包含必须分配和释放的操作系统资源。因此,有必要处理您创建的每种颜色。
那么处理颜色的最佳方法是什么?
来自http://www.eclipse.org/articles/swt-design-2/swt-design-2.html:
如果您在小部件中使用图形资源 - 例如,widget.setFont(font) - 通常最好在释放它们所使用的小部件时清理这些资源,以便您可以在小部件上挂接一个 dispose 侦听器。 .
所以我可以跟踪我分配的每种颜色,并将它们DisposeListener
放置在画布或外壳上。但来自同一个链接:
当程序退出时,操作系统会释放程序的所有资源。为什么不只依靠这个?操作系统资源不是无限的。如果您的程序没有释放不再需要的资源,则可能会耗尽资源。它还可能导致其他程序耗尽资源。所以等到程序退出来释放资源通常是个坏主意。
看起来我没有得到任何东西,因为即使颜色被处理,它们也会在退出时被处理(视图持续程序的生命周期)。
我认为我不能直接PaintListener
在在那次通话中没有再次使用?
如果我做到了,如果只有几种颜色可用,还有另一个问题。由于颜色分配的顺序,我可以渲染许多红色阴影,然后用完颜色,并且无法显示任何绿色阴影。那么在这种情况下,在程序开始时预先分配我可能需要的一系列颜色(如调色板)会更好吗?我应该分配多少个,按什么顺序分配?这意味着永远不要丢弃这些颜色。
另外,有什么方法可以随时知道有多少种颜色可用?其他正在运行的程序是否会占用可用的颜色数量?