Prevent double click

How can I prevent my user to double click in one button?

Sometimes my user dont pay atencion on top bar (loading) and press the save button 2 times, and the method are executed 2 times, so how can I prevent this?

tks

Does Button.setDisableOnClick(true) works for you?

Don`t work as expected, somethins he dont enable the button back :confused:

It should never enable back automatically, that is something you need to do yourself from the code. It is an inconvenience, but at least you don’t get double clicks :slight_smile:

The button needs to be enabled back programatically. Quoting the setDisableOnClick() javadoc: “Also, if developer * wants to re-enable the button, it needs to be done programmatically.”

Just please make sure that you call setEnabled(true) in your button’s onclick handler.

agh, there is workaround

	/**
	 * Disables button after 1st click, then enables it after certain time => 2nd click is performed over disabled button
	 * => double-click is disabled
	 * @param btnSubmit
	 */
	private static void preventDoubleClick(Button btnSubmit) {
		UI ui = UI.getCurrent();
		btnSubmit.setDisableOnClick(true);
		btnSubmit.addClickListener(event -> setTimeoutAsync(() -> {
			ui.access(() -> btnSubmit.setEnabled(true));
		}, 300));
	}

	public static void setTimeoutAsync(Runnable runnable, int delay) {
		new Thread(() -> {
			try {
				Thread.sleep(delay);
				runnable.run();
			}
			catch (Exception e){
				log.error(e.getMessage(), e);
			}
		}).start();
	}

more correct fix (just instantly adds constructors ;))

public CustomButton extends Button {
	private ComponentEventListener<ClickEvent<Button>> doubleClickListener;
	private ComponentEventListener<ClickEvent<Button>> moreClickListener;

	@Override
	public Registration addClickListener(ComponentEventListener<ClickEvent<Button>> listener) {
		return super.addClickListener(event -> {
			if(event.getClickCount() == 1) {
				listener.onComponentEvent(event);
			} else if (event.getClickCount() == 2 && doubleClickListener != null) {
				doubleClickListener.onComponentEvent(event);
			} else if (event.getClickCount() > 2 && moreClickListener != null) {
				moreClickListener.onComponentEvent(event);
			}
		});
	}

	public GimsButton doubleClickListener(ComponentEventListener<ClickEvent<Button>> listener) {
		this.doubleClickListener = listener;
		return this;
	}

	public GimsButton moreClickListener(ComponentEventListener<ClickEvent<Button>> listener) {
		this.moreClickListener = listener;
		return this;
	}
}