把Swing的Icon轉換到SWT的Image

2021-09-03 10:06:23 字數 2205 閱讀 2576

環境:windows7、eclipse 3.5、jre1.6

最近在研究swt的treeview控制項,想要寫乙個類似於windows資源管理器的目錄樹,弄了半天,目錄樹是出來了,但是圖示搞不出來,何解?filesystemview.getfilesystemview().getsystemicon(file f)這個函式返回的是個icon物件,是用在swing上的,而我的目錄樹採用的是swt/jface treeviewer控制項,其ilabelprovider的getimage()介面返回的是swt的image物件。這兩個玩意兒得轉換一下才能使用。

在網上找了半天的資料,發現沒有現成的api可以一句話就完成轉換,都是需要寫一段**來完成。有幾個方案,基本思路都是將icon物件內所包含的icon資料轉換成資料流,然後根據這個資料流重新生成image,其**如下:

@override

publicimage getimage(object element)

icon的確是轉換到image了,看下面的效果圖:

雖然icon轉換到了image,可是周圍全都是黑色,這是因為icon在轉換的時候,原來的裡面是透明色的畫素點,轉換過來系統自動變成了黑色,因此**還需要額外的處理一下,修改後的**如下:

@override

publicimage getimage(object element)

// 根據陣列資料生成

imagedata

物件imagedata imagedata =newimagedata(width, height, 24,newpalettedata(0xff0000, 0x00ff00, 0x0000ff));

imagedata.setpixels(0, 0, data.

length

, data, 0);

// 生成

image

物件image swtimage =newimage(platformui.getworkbench().getdisplay(), imagedata);

returnswtimage;

}和上面的**相比,新增加了乙個迴圈,將緩衝區內為0的資料修改為0xffffff,也就是將相應的畫素設定為白色,效果圖如下:

看起來效果好多了,可是如果目光敏銳一點的話,還是能夠看出破綻來,擷取乙個圖示,放大後仔細看一看:

和正常的圖示對比一下,可以發現邊邊角角的顏色都不對,普遍偏深,可是網上找到的資料到這裡就為止了,沒有人提出來如何解決這個問題,當然,這也可能跟我的系統有關係。經過跟蹤和除錯,發現其實呼叫

systemicon.getimage() 得到的物件就已經是乙個bufferedimage物件了,沒有必要再去重新new乙個,而事實證明,就是這個new操作,導致轉換後的出現上述問題。 根據

systemicon.getimage()得到bufferedimage物件後,因為該物件內部資料實際上就已經是檔案圖示資料了,所以呼叫

graphics2d繪製icon的操作也沒必要了,最後修改後的**如下:

@override

publicimage getimage(object element)

// 根據陣列資料生成

imagedata

物件imagedata imagedata =newimagedata(width, height, 24,newpalettedata(0xff0000, 0x00ff00, 0x0000ff));

imagedata.setpixels(0, 0, data.

length

, data, 0);

// 生成

image

物件image swtimage =newimage(platformui.getworkbench().getdisplay(), imagedata);

returnswtimage;

}這回效果圖如下:

看起來好看多了,基本上跟windows資源管理器的效果差不多了。不過如果目光依舊敏銳的話,再繼續開啟某一驅動器,看資料夾圖示,還是有一點小小的瑕疵,有些icon在轉換過來的時候,會莫名其妙的在原來沒有顏色的畫素點上增加一點淡淡的顏色,不過影響已經不大了,就姑且這樣吧。期待有高手能夠進一步將其搞定。

好訊息,這個問題我自己搞定了,參見《把swing的icon轉換到swt的image(續)》這篇文件。

如何把access轉換到mysql

access 只能在 windows 下使用這一致命的特性讓我深惡痛絕,痛下決心要把 access 轉換到mysql,但是從網上找了很多文章,都沒有直接轉換的東西。聽說可以利用odbc轉,就嘗試了一下。先安裝好mysql,myodbc,建乙個mysql的空資料庫,在odbc管理中加上這個資料庫,指定...

C 無損轉換Image為Icon的方法

如題,市面上常見的方法是 var handle bmp.gethicon 得到圖示控制代碼 return icon.fromhandle handle 通過控制代碼得到圖示 此法的問題是,如果影象是透明背景,那麼得到的icon的邊緣就是毛糙的,像是先墊了一層背景色然後再去色的效果,很不如人意,用過的...

從Drupal轉換到Yii的理由

基本上drupal包括joomla 是設計給非技術人員使用的.當然圍繞著這些平台,已經有了很好的技術生態圈.不過如果你要設計大型的 月訪問達到百萬pv以上的級別,那麼現有的drupal 應該考慮盡快切換到yii等高效能框架上來.主要原因是drupal為了通用 易用引入了很多不必要的複雜性 如cck ...