Java 如何更改SWT按钮背景色或使其透明

Java 如何更改SWT按钮背景色或使其透明,java,button,swt,eclipse-rcp,Java,Button,Swt,Eclipse Rcp,我在按钮上有一个透明的图像(无文本),它放在一个组合文件上。由于组合是白色的(使用创建),我希望按钮背景是相同的颜色。我该怎么做 标签起作用,但不像我点击按钮时的按钮那样有阴影。按钮的背景色由操作系统决定。事实上,该文件规定: 注意:此操作是一个提示,可能会被平台覆盖。例如,在Windows上,按钮的背景无法更改 也就是说,一种可能的规避方法是覆盖绘制事件,如下所示:。当我尝试这个方法时,结果有点不稳定 最安全、最一致的方法是使用第二张图像中的标签,但在不同的鼠标事件上显示不同的图像,以模拟按钮

我在
按钮上有一个透明的图像(无文本),它放在一个
组合文件上。由于
组合
是白色的(使用创建),我希望
按钮
背景是相同的颜色。我该怎么做


标签起作用,但不像我点击按钮时的按钮那样有阴影。

按钮的背景色由操作系统决定。事实上,该文件规定:

注意:此操作是一个提示,可能会被平台覆盖。例如,在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());
            }
        });
    }

}
其中,
主题
已经方便地加载了所有图像

您还需要确保父级
组合
的背景模式设置为强制其背景色:

parent.setBackgroundMode(SWT.INHERIT_-FORCE)


显然,这种方法的缺点是您必须自己处理鼠标单击逻辑(即,在释放鼠标之前,mouseDown不会真正被单击,因此您必须处理每个侦听器方法中按钮的状态)。

您是否可以添加一个屏幕截图来解释您正在谈论的内容?很高兴。您可以看到带有图像的按钮的3个版本。第一个是我得到的,第二个是标签(但不像按钮,这意味着它不会改变,如果我点击它或悬停)。请注意,它位于合成图的白色背景上。第三个刷新按钮就是我想要的样子。虽然这不是一个按钮,但它是放置在部分标题栏上的一个操作(看起来像一个按钮,与背景混合,对用户来说是直观的,因为它看起来“可单击”)。