使用SWT创建自定义按钮

时间:2009-11-22 19:41:01

标签: java swt

我想问的问题与this question相同,但使用SWT:有没有办法用你自己的按钮图形制作一个按钮而不只是按钮内的图像?如果不是另一种在java中创建自定义按钮的方法吗?

2 个答案:

答案 0 :(得分:12)

public class ImageButton extends Canvas {
    private int mouse = 0;
    private boolean hit = false;

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

        this.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                switch (mouse) {
                case 0:
                    // Default state
                    e.gc.drawString("Normal", 5, 5);
                    break;
                case 1:
                    // Mouse over
                    e.gc.drawString("Mouse over", 5, 5);
                    break;
                case 2:
                    // Mouse down
                    e.gc.drawString("Hit", 5, 5);
                    break;
                }
            }
        });
        this.addMouseMoveListener(new MouseMoveListener() {
            public void mouseMove(MouseEvent e) {
                if (!hit)
                    return;
                mouse = 2;
                if (e.x < 0 || e.y < 0 || e.x > getBounds().width
                        || e.y > getBounds().height) {
                    mouse = 0;
                }
                redraw();
            }
        });
        this.addMouseTrackListener(new MouseTrackAdapter() {
            public void mouseEnter(MouseEvent e) {
                mouse = 1;
                redraw();
            }

            public void mouseExit(MouseEvent e) {
                mouse = 0;
                redraw();
            }
        });
        this.addMouseListener(new MouseAdapter() {
            public void mouseDown(MouseEvent e) {
                hit = true;
                mouse = 2;
                redraw();
            }

            public void mouseUp(MouseEvent e) {
                hit = false;
                mouse = 1;
                if (e.x < 0 || e.y < 0 || e.x > getBounds().width
                        || e.y > getBounds().height) {
                    mouse = 0;
                }
                redraw();
                if (mouse == 1)
                    notifyListeners(SWT.Selection, new Event());
            }
        });
        this.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if (e.keyCode == '\r' || e.character == ' ') {
                    Event event = new Event();
                    notifyListeners(SWT.Selection, event);
                }
            }
        });
    }

}

答案 1 :(得分:-1)

不,你可以在一个按钮上添加一个PaintListener,但它可能看起来很奇怪。

您需要做的是将窗口的样式设置为“所有者绘制”,然后在Button#wmDrawChild方法中添加绘图代码。这意味着您需要在内部SWT类上添加依赖项,它只适用于Windows。