2014-02-09 92 views
1

我有一個透明圖像上的Button(無文字),它放置在Composite。由於Composite是白色(使用FormToolkit#createComposite(parent, SWT.NONE)創建),因此我希望Button背景具有相同的顏色。我該怎麼做?如何更改SWT按鈕背景顏色或使其透明

Label的伎倆,但沒有陰影像Button確實,當我點擊它..

+0

你能添加一個截圖解釋你在說什麼嗎? – Baz

+0

很高興。 [在此屏幕截圖上](http://s8.postimg.org/myx1lpjfl/refresh.png),您可以看到帶有圖像的3個按鈕版本。第一是我得到的,第二是標籤(但不像按鈕,這意味着它不會改變,如果我點擊它或懸停)。注意它在複合材料的白色背景上。第三次刷新按鈕是我想要的樣子。這不是一個按鈕,它是一個放在Section標題欄上的Action(看起來像一個按鈕,與背景混合並且對用戶來說很直觀,因爲它看起來「可點擊」)。 –

回答

1

一個Button的背景顏色是由操作系統決定的。實際上,文檔Control.setBackground()指出:

注意:此操作是一個提示,可能會被平臺覆蓋。例如,在Windows上,Button的背景無法更改。

這就是說,一個規避這可能的方式是覆蓋漆事件,如下所示:Changing org.eclipse.swt.widgets background color in Windows。當我嘗試這個結果時,結果有點不可靠。

最安全和最一致的方法是使用第二張圖像中的標籤,但在各種鼠標事件上顯示不同的圖像以模擬按鈕的行爲方式。

這些圖像可以通過將任意形狀的陰影添加到圖像本身來模擬陰影。該陰影也可以爲每個圖像改變,以給出按鈕被按下或不按下的印象。

例如,我想沿着線的東西:

public class MyButton { 

    private final Label buttonLabel; 

    public MyButton(final Composite parent, final Theme theme) { 
     buttonLabel = new Label(parent, SWT.NONE); 
     buttonLabel.setImage(theme.getUpImage()); 
     buttonLabel.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseDown(final MouseEvent mouseEvent) { 
       buttonLabel.setImage(theme.getButtonPressedImage()); 
      } 
      @Override 
      public void mouseUp(final MouseEvent mouseEvent) { 
       buttonLabel.setImage(theme.getButtonUpImage()); 
      } 
     }); 
     buttonLabel.addMouseTrackListener(new MouseTrackAdapter() { 
      @Override 
      public void mouseEnter(final MouseEvent mouseEvent) { 
       buttonLabel.setImage(theme.getButtonHoverImage()); 
      } 
      @Override 
      public void mouseExit(final MouseEvent mouseEvent) { 
       buttonLabel.setImage(theme.getButtonUpImage()); 
      } 
     }); 
    } 

} 

Theme只是有所有已加載方便的圖像。

您還需要確保父Composite有後臺模式設置爲強制其背景色:

parent.setBackgroundMode(SWT.INHERIT_FORCE);

顯然的缺點,這種方法是,你必須處理鼠標點擊邏輯你自己(即mouseDown不會真正點擊,直到鼠標被釋放,所以你將不得不處理每個監聽器方法中的按鈕的狀態)。