【问题标题】:SWT image button on Mac not workingMac上的SWT图像按钮不起作用
【发布时间】:2014-05-06 18:44:57
【问题描述】:

所以我有一个使用 SWT 的带有图像的按钮。 它的设计代码在这里:

final Button button = new Button(shell, SWT.FLAT | SWT.CENTER); button.setBounds(54, 121, 109, 33); button.setImage(SWTResourceManager.getImage(LoginDialog.class, "SignInButton.png"));

我想让图像占据整个按钮,没有边框,就像在 Windows 中一样。有谁知道如何做到这一点?

这是 atm 的图像:

基本上我只是希望白色部分消失。

【问题讨论】:

  • 不要使用setBounds - 使用layout 以便按钮可以计算出自己的大小。我不认为可以在 Mac 按钮上移除边框。

标签: java eclipse image button swt


【解决方案1】:

好吧,Button 不是您想要绘制完全不同类型的按钮的最佳起点。但是,您可以使用 this 教程创建自己的小部件。我在这里写了一个例子:

public class ImageButton extends Composite
{
    private Color   textColor;
    private Image   image;
    private String  text;
    private int     width;
    private int     height;

    public ImageButton(Composite parent, int style)
    {
        super(parent, style);

        textColor = Display.getDefault().getSystemColor(SWT.COLOR_WHITE);

        /* Add dispose listener for the image */
        addListener(SWT.Dispose, new Listener()
        {
            @Override
            public void handleEvent(Event arg0)
            {
                if (image != null)
                    image.dispose();
            }
        });

        /* Add custom paint listener that paints the stars */
        addListener(SWT.Paint, new Listener()
        {
            @Override
            public void handleEvent(Event e)
            {
                paintControl(e);
            }
        });

        /* Listen for click events */
        addListener(SWT.MouseDown, new Listener()
        {
            @Override
            public void handleEvent(Event arg0)
            {
                System.out.println("Click");
            }
        });
    }

    private void paintControl(Event event)
    {
        GC gc = event.gc;

        if (image != null)
        {
            gc.drawImage(image, 1, 1);
            Point textSize = gc.textExtent(text);
            gc.setForeground(textColor);
            gc.drawText(text, (width - textSize.x) / 2 + 1, (height - textSize.y) / 2 + 1, true);
        }
    }

    public void setImage(Image image)
    {
        this.image = new Image(Display.getDefault(), image, SWT.IMAGE_COPY);
        width = image.getBounds().width;
        height = image.getBounds().height;
        redraw();
    }

    public void setText(String text)
    {
        this.text = text;
        redraw();
    }

    @Override
    public Point computeSize(int wHint, int hHint, boolean changed)
    {
        int overallWidth = width;
        int overallHeight = height;

        /* Consider hints */
        if (wHint != SWT.DEFAULT && wHint < overallWidth)
            overallWidth = wHint;

        if (hHint != SWT.DEFAULT && hHint < overallHeight)
            overallHeight = hHint;

        /* Return computed dimensions plus border */
        return new Point(overallWidth + 2, overallHeight + 2);
    }

    public static void main(String[] args)
    {
        Display display = Display.getDefault();
        Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1, false));

        ImageButton button = new ImageButton(shell, SWT.NONE);
        button.setImage(new Image(display, "button.png"));
        button.setText("Button");

        shell.pack();
        shell.open();

        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}

看起来像这样:


当然,您必须处理不同的状态,例如 pressedhover 等等。

【讨论】:

  • 哦,我明白了,这对我的项目很有帮助,谢谢。有点希望 swt mac 按钮能像 Windows 按钮一样工作。 =/
猜你喜欢
  • 2011-07-20
  • 2011-01-08
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 2012-09-25
相关资源
最近更新 更多