Button Functionality (over, pressed and down)

Slick doesn’t have a native released method, he’ll need to create it. I believe there are some topics about it on these forums that helped me.

Here’s a UIButton class from my game engine, it may help you:


/**
 *
 * @author David
 */
public abstract class UIButton
        extends BaseWidget {

    protected ButtonState state = ButtonState.NORMAL;
    protected String text;

    protected UIButton() {
    }

    protected boolean isRolledOver() {
        return manager.rolledoverWidget() == this;
    }

    protected void checkState() {
        if (manager.rolledoverWidget() != this || manager.rolledoverManager() != manager) {
            state = ButtonState.NORMAL;
        }
    }
    protected boolean mouseInside = false;

    public void widgetUpdate(long elapsedMillis) {
    }

    public boolean onPointerPressed(PointerEvent evt) {
        if (inside(evt.getX(), evt.getY()) && evt.isLeftButton()) {
            mouseInside = true;
            state = ButtonState.PRESSED;
            manager.focusWidget(UIButton.this);
            return true;
        }
        manager.focusWidget(null);
        return false;
    }

    public boolean onPointerReleased(PointerEvent evt) {
        boolean wasMouseInside = mouseInside;
        mouseInside = false;
        if (inside(evt.getX(), evt.getY()) && wasMouseInside && evt.isLeftButton()) {
            state = ButtonState.ROLLOVER;
            manager.focusWidget(UIButton.this);
            dispatchAction();
            return true;
        }
        manager.focusWidget(null);
        return false;
    }

    public boolean onPointerMoved(PointerEvent evt) {
        if (inside(evt.getX(), evt.getY())) {
            manager.rolloverWidget(UIButton.this);
            state = ButtonState.ROLLOVER;
            return true;
        }
        state = ButtonState.NORMAL;
        return false;
    }

    public boolean onPointerDragged(PointerEvent evt) {
        if (inside(evt.getX(), evt.getY()) && mouseInside) {
            state = ButtonState.PRESSED;
            return true;
        }
        state = ButtonState.NORMAL;
        return false;
    }

    protected boolean inside(int x, int y) {
        return MathTool.inRect(x, y, getX(), getY(), width, height);
    }

    protected void dispatchAction() {
        if (listener != null) {
            listener.handleAction(null);
        }
    }

    @Override
    public void onKeyReleased(KeyEvent evt) {
        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            dispatchAction();
        }
    }
}


Uses a different event dispatch system to Slick but the idea behind it should always be the same.

Alright, thank you guys for your time. I will see what I can do later with your code examples. Right now I’m not really focused into this… and I have to go now do some other work.