как добавить эффект наведения мыши на «кнопку», нарисованную gc - PullRequest
1 голос
/ 06 декабря 2011

Я хочу создать приложение с графическим интерфейсом, которое должно быть полностью нарисовано на холсте, никакие другие виджеты не будут использоваться.

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 Ответ

4 голосов
/ 06 декабря 2011

Если я правильно понимаю ваш код, ваши кнопки - это кружки (овалы) на Canvas.

Вам необходимо написать метод позиционирования, который определяет, находится ли конкретная точка x, y на Canvas внутри или снаружи одного из овалов. Вы используете MouseMoveListener, метод mouseMove вместе с вашим методом позиционирования, чтобы определить, находится ли мышь внутри или снаружи одного из ваших овалов.

Если мышь находится внутри овала, вы рисуете «оверную» версию овала. Если мышь находится вне овала, вы рисуете обычную версию овала.

Вы используете MouseListener, метод mouseDown вместе с методом позиционирования, чтобы определить, когда пользователь щелкнул левой кнопкой мыши по одному из овалов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...