我有时需要在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();
}
}
Run Code Online (Sandbox Code Playgroud)
在SWT中,您应该始终释放资源.来自http://www.eclipse.org/articles/Article-SWT-Color-Model/swt-color-model.htm:
颜色包含必须分配和释放的OS资源.因此,必须处理您创建的每种颜色.
那么处理颜色的最佳方法是什么?
来自http://www.eclipse.org/articles/swt-design-2/swt-design-2.html:
如果您在窗口小部件中使用图形资源 - 例如,widget.setFont(字体) - 通常最好在它们被使用的窗口小部件被清理时清除它们,这样您就可以在窗口小部件上挂钩一个dispose侦听器. .
所以我可以跟踪我分配的每种颜色,并将它们DisposeListener放在画布或外壳上.但是从同一个链接:
程序退出时,操作系统释放程序的所有资源.为什么不依靠这个呢?操作系统资源不是无限的.如果您的程序不再释放资源,因为它们不再需要,它可能会耗尽资源.它还可能导致其他程序耗尽资源.所以等到程序退出以释放资源通常是一个坏主意.
看起来我没有获得任何东西,因为即使颜色被处理掉,它们也会在出口处被放置(视图持续程序的生命周期).
我认为它不能直接处理颜色,PaintListener因为它们在显示时仍然被GC使用,所以我必须记住正在使用的颜色并将它们丢弃在下一次油漆调用中那次通话再次被使用了?
如果我管理它,如果只有几种颜色,还有另一个问题.由于颜色分配的顺序,我可以渲染许多红色,然后用尽颜色,并且不能显示任何颜色的绿色.那么在这种情况下,预先分配我在程序开头可能需要的一系列颜色(如调色板)会更好吗?我应分配多少以及按什么顺序分配?这意味着永远不要处理这些颜色.
另外,有什么方法可以随时了解有多少颜色可供使用?其他正在运行的程序是否会消除可用的颜色数量?
Eclipse RCP通过全局ColorRegistry处理此问题.
通过使用它,您可以避免在应用程序启动时进行资源预分配.当您需要资源时,可以查询全局注册表.如果它不可用,则使用全局注册表分配并注册它.
private static final String SHADE = "shadedcolor";
Color color = null;
if (!JFaceResources.getColorRegistry().hasValueFor(SHADE)) {
color = new Color(Display.getCurrent(), shade, 255-shade, 0);
JFaceResources.getColorRegistry().put(SHADE, color);
} else {
color = JFaceResources.getColorRegistry().get(SHADE);
}
Run Code Online (Sandbox Code Playgroud)
资源将在应用程序退出时释放.
| 归档时间: |
|
| 查看次数: |
1864 次 |
| 最近记录: |