2014-02-09 294 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不会真正点击,直到鼠标被释放,所以你将不得不处理每个监听器方法中的按钮的状态)。