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 在释放鼠标之前不会真正被点击,因此您必须处理每个侦听器中的按钮状态方法)。