2012-11-16 68 views
3

我有時需要在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使用,所以我必須記住正在使用的顏色並將它們置於如果他們在那次電話中沒有再次使用,接下來的油漆呼叫?

如果我管理它,如果只有幾種顏色可用,還有另一個問題。由於顏色被分配的順序,我可以渲染許多紅色陰影,然後用盡顏色,並且不能顯示任何綠色陰影。那麼在這種情況下,是否會更好地預先分配我在程序開始時可能需要的一系列顏色(如調色板)?我應該分配多少和按什麼順序?這意味着永遠不會處理這些顏色。

此外,有什麼方法可以隨時知道有多少顏色可用?其他正在運行的程序是否會消除可用的顏色數量?

+0

也許很高興知道,不僅應該處理'顏色'。您應該處理[字體](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)以同樣的方式。 –

回答

5

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); 
} 

該資源將在應用程序退出時解除分配。

+0

你的代碼不能編譯 – ZhekaKozlov

1

paintControl方法中,創建顏色,使用它並進行處理。

Color color = new Color(Display.getCurrent(), shade, 255-shade, 0); 
gc.setBackground(color); 
gc.fillRectangle(x, 0, 50, 50); // this call renders it then you can dispose the color 
color.dispose(); 

這種方法的問題是,創建/銷燬資源是昂貴的操作。這就是爲什麼你需要緩存它。

我建議你製作shadeColor作爲Item的財產。當分數變化時,處置現有的shadeColor並創建新的shareColor。當處置/移除Item時,處置shareColor

1

除了以前的答案,您可以使用系統顏色。這些顏色不需要處理。

你可以通過調用Display#getSystemColor(int)訪問它們:

Display display = Display.getCurrent(); 
Color blue = display.getSystemColor(SWT.COLOR_BLUE); 

有關可用顏色的列表,請訪問:Javadoc of SWT

您可以使用任何與SWT.COLOR_開始。