在SWT中,用setBackgroundImage函數顯示背景圖片是用平鋪的方式,並且不能改變其大小。為了可以顯示圖片,並且使圖片隨着View大小的改變而變化,這可以選擇控件的addPaintListener方法,通過添加這個事件來畫圖像。
首先,獲取image,獲取org.eclipse.swt.widgets.Image的方式有兩種:
1、使用絕對路徑
Image image = new Image(Display.getDefault(),"D:/1.jpg");
2、使用相對路徑
ImageDescriptor imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin(pluginId, "SystemData/1.jpg");
Image image = imageDescriptor.createImage();
//SystemData/1.jpg:指的在工程的根目錄下的SystemData文件夾內的1.jpg
然后,可以將這個jpg的圖片在org.eclipse.swt.widgets.Canvas中繪出,或者是org.eclipse.swt.widgets.Label中繪出。實驗之后,發現在Label中繪制時,其大小隨View窗體改變的時候,會出現圖片只有邊緣改變,而其他部分不會改變的情況。所以這是我用的的Canvas。
final int imgWidth = image.getBounds().width; final int imgHeight = image.getBounds().height; Canvas canvas = new Canvas(parent, SWT.DOUBLE_BUFFERED); canvas.addPaintListener(new PaintListener() { @Override public void paintControl(PaintEvent event) { // TODO Auto-generated method stub event.gc.drawImage(image, 0, 0, imgWidth, imgHeight, 0, 0, event.width, event.height); } });
在處理圖片閃爍時,將canvas設置為了SWT.DOUBLE_BUFFERED樣式,則這樣就可以使用雙緩沖區,消除在圖片在redraw時的閃爍。(雙緩沖區的其中一種實現機制:首先把背景色和其他內容保存在一幅圖形當中,當收到重新繪圖的時候,將整個圖形設置到需要重畫的區域)
p.s. 小菜一枚,如果有什么不對的地方,請指出來啊。
p.s. 恭喜Bunny馬上就要結束2的生活,森日快樂~