如何将鼠标悬停效果添加到gc绘制的“按钮”

时间:2011-12-06 08:48:29

标签: swt

我想构建一个gui应用程序,它应该完全在画布上绘制,不会使用其他小部件。

package cn.ggfan.fun.music.gui;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class GGPlayerGUI {

    private static Shell shell;

    /**
     * @param args
     */
    public static void main(String[] args) {
        final Display display = new Display();

        shell = new Shell(display, SWT.NO_TRIM | SWT.RESIZE);
        shell.setLayout(new FillLayout());
        shell.setSize(300, 500);
        shell.setAlpha(200);
        Canvas canvas = new Canvas(shell, SWT.NONE);
        canvas.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
        canvas.addPaintListener(new PaintListener(){

            public void paintControl(PaintEvent e) {
                e.gc.setAlpha(255);
                e.gc.setAntialias(SWT.ON);
                e.gc.setLineWidth(2);
                e.gc.setForeground(new Color(display, 187, 30, 136));
                e.gc.drawLine(0, 80, 300, 80);
                e.gc.drawLine(0, 450, 300, 450);
                //gc.fillPolygon(new int[] { 25,5,45,45,5,45 }) 
                e.gc.setBackground(new Color(display, 187, 30, 136));
                e.gc.fillPolygon(new int[]{100,470,90,475,100,480});
                e.gc.fillPolygon(new int[]{110,470,100,475,110,480});
                //e.gc.fillPolygon(new int[]{100,470,90,475,100,480});
                e.gc.fillRoundRectangle(145,470,3,10,2,2);
                e.gc.fillRoundRectangle(152,470,3,10,2,2);

                e.gc.fillPolygon(new int[]{200,470,210,475,200,480});
                e.gc.fillPolygon(new int[]{190,470,200,475,190,480});
                e.gc.setForeground(new Color(display, 250, 250, 250));
                //e.gc.setLineWidth(1);
                e.gc.drawOval(80, 455, 40, 40);
                e.gc.drawOval(130, 455, 40, 40);
                e.gc.drawOval(180, 455, 40, 40);
            }
        });

        shell.open();

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

        display.dispose();
    }

}
它看起来像这样:
enter image description here我应该怎样做才能使“按钮”被点击并具有悬停效果?

1 个答案:

答案 0 :(得分:4)

如果我正确理解您的代码,您的按钮就是Canvas上的圆圈(椭圆形)。

您需要编写一个位置方法,以确定Canvas上的特定x,y点是否位于其中一个椭圆的内部或外部。您使用MouseMoveListenermouseMove方法以及您的位置方法来确定鼠标何时在您的一个椭圆形内部或外部。

如果鼠标位于椭圆内,则绘制椭圆的“悬停”版本。如果鼠标位于椭圆形之外,则绘制椭圆形的常规版本。

您使用MouseListenermouseDown方法以及您的位置方法来确定用户何时左键单击其中一个椭圆。