【问题标题】:How to change SWT Button background color or make it transparent如何更改 SWT 按钮背景颜色或使其透明
【发布时间】:2014-02-09 14:07:30
【问题描述】:

我在Button 上有一个透明 图像(无文字),该图像位于Composite 上。由于Composite 是白色的(使用FormToolkit#createComposite(parent, SWT.NONE) 创建),我希望Button 背景颜色相同。我该怎么做?

Label 可以解决问题,但没有像 Button 在我单击它时出现的阴影..

【问题讨论】:

  • 你能添加一个截图来解释你在说什么吗?
  • 很高兴。 On this screenshot 你可以看到按钮的 3 个版本和图像。第一个是我得到的,第二个是标签(但不像按钮,这意味着如果我单击它或悬停它不会改变)。请注意,它位于 Composite 的白色背景上。第三个刷新按钮是我想要的样子。虽然这不是一个按钮,但它是一个放置在部分标题栏上的操作(看起来像一个按钮,与背景融为一体,并且对用户来说很直观,因为它看起来“可点击”)。

标签: java button swt eclipse-rcp


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

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    相关资源
    最近更新 更多