Как указать кнопку для открытия URL-адреса?

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

Таким образом, я создал ссылку, которая приводит к URL-адресу, соответствующему схеме URI mailto (http://en.wikipedia.org/wiki/Mailto):

Link emailLink = new Link("Send Email", 
    new ExternalResource("mailto:[email protected]"));

Однако вместо использования ссылки я хочу предоставить кнопку, которая позволяет запускать соответствующие функции. Но для кнопок я не могу установить ExternalResource для открытия.

Кто-нибудь знает, как решить эту проблему для кнопок, или как создать ссылку, которая выглядит и ведет себя точно так же, как кнопка? Я также пробовал некоторые модификации CCS, но сам не справился с этой задачей. Я также нашел некоторые решения для прежних версий Vaadin (https://vaadin.com/forum/#!/thread/69989), но, к сожалению, они не работают для Vaadin 7.

Ответ 1

Я помню решение аналогичной проблемы с помощью ResourceReference.

Button emailButton = new Button("Email");
content.addComponent(emailButton);
Resource res = new ExternalResource("mailto:[email protected]");
final ResourceReference rr = ResourceReference.create(res, content, "email");

emailButton.addClickListener(new Button.ClickListener() {

    @Override
    public void buttonClick(ClickEvent event) {
        Page.getCurrent().open(rr.getURL(), null);
    }
});

Ответ 2

Для решения аналогичной проблемы я применил ранее:

    String email="[email protected]";
    Link l=new Link();
    l.setResource(new ExternalResource("mailto:" + email));
    l.setCaption("Send email to " + email);
    addComponent(l);

Ответ 3

После некоторых дальнейших попыток удалось адаптировать предлагаемое решение LinkButton от https://vaadin.com/forum/#!/thread/69989 для Vaadin 7:

public class LinkButton extends Button {
    public LinkButton(final String url, String caption) {
        super(caption);
        setImmediate(true);
        addClickListener(new Button.ClickListener() {
            private static final long serialVersionUID = -2607584137357484607L;

            @Override
            public void buttonClick(ClickEvent event) {
                LinkButton.this.getUI().getPage().open(url, "_blank");
            }
        });
    }
}

Однако это решение по-прежнему не идеально, поскольку оно вызывает открытие всплывающего окна некоторыми веб-браузерами.