我有時需要在SWT中動態生成顏色。以一個視圖爲例,該視圖以不同的顏色顯示紅綠色分數。可能有其他類似的視圖有不同的顏色:SWT中的動態顏色應該如何分配和處理?
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中,您應該始終釋放資源。 From 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(字體) - 這往往是最好的清理這些了,當小部件他們佈置中使用,這樣你就可以勾上小部件釋放偵聽...
所以我可以跟蹤我分配各種顏色的,並在畫布或外殼上DisposeListener
處理它們。但從相同的鏈接:
當程序退出時,操作系統釋放所有程序的資源。爲什麼不僅僅依靠這個?操作系統資源不是無限的。如果您的程序因爲不再需要而無法釋放資源,則可能會耗盡資源。它也可能導致其他程序耗盡資源。所以等到程序退出釋放資源通常是一個壞主意。
它看起來像,因爲即使顏色設置,他們將被安置反正退出(視圖持續的程序的生命週期),我並沒有得到任何東西。
我認爲我不能直接在PaintListener
中處理顏色,因爲它們在顯示時仍然由GC使用,所以我必須記住正在使用的顏色並將它們置於如果他們在那次電話中沒有再次使用,接下來的油漆呼叫?
如果我管理它,如果只有幾種顏色可用,還有另一個問題。由於顏色被分配的順序,我可以渲染許多紅色陰影,然後用盡顏色,並且不能顯示任何綠色陰影。那麼在這種情況下,是否會更好地預先分配我在程序開始時可能需要的一系列顏色(如調色板)?我應該分配多少和按什麼順序?這意味着永遠不會處理這些顏色。
此外,有什麼方法可以隨時知道有多少顏色可用?其他正在運行的程序是否會消除可用的顏色數量?
也許很高興知道,不僅應該處理'顏色'。您應該處理[字體](http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fswt%2Fgraphics%2FFont。 html),[Images](http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fswt%2Fgraphics%2FImage。 html)和[Cursors](http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fswt%2Fgraphics%2FCursor。 HTML)以同樣的方式。 –