Да, есть
Нет, нет - по крайней мере, без работы с самим классом GWT DialogBox или путем воссоздания DialogBox с использованием общих виджетов. Это известная проблема в GWT, также известная как 1405 (пометьте ее, чтобы показать свой интерес).
Тем не менее, DialogBox не дает нам инструментов для этого, поэтому нам нужно расширить его - Редактировать: это не работает.
Если вы хотите сделать вставную замену для DialogBox, вы можете назвать свой класс DialogBox и импортировать его вместо того, который включен в GWT. Эта ветка на форуме GWT дает более подробную информацию о том, как это можно сделать (устарела, использует слушателей) Устаревшая внутренняя часть DialogBox сильно изменилась с этой ветки - она не не работает.
Вот некоторый код, который я взломал, чтобы получить те же результаты (использовал связанный поток для руководства) . Это не работает:
MyDialogBox:
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
public class MyDialogBox extends DialogBox {
private class crossHandler implements ClickHandler, MouseOverHandler, MouseOutHandler
{
@Override
public void onClick(ClickEvent event) {
hide();
Window.alert("Click!");
}
@Override
public void onMouseOver(MouseOverEvent event) {
DOM.setStyleAttribute(cross.getElement(), "font-weight", "bold");
}
@Override
public void onMouseOut(MouseOutEvent event) {
DOM.setStyleAttribute(cross.getElement(), "font-weight", "normal");
}
}
Label cross = new Label("X"); // The close button
crossHandler crosshandler = new crossHandler();
HTML caption = new HTML(); // The caption aka title
HorizontalPanel captionPanel = new HorizontalPanel(); // Contains caption and cross
/**
* Creates an empty dialog box. It should not be shown until its child widget
* has been added using {@link #add(Widget)}.
*/
public MyDialogBox()
{
this(false);
}
/**
* Creates an empty dialog box specifying its "auto-hide" property. It should
* not be shown until its child widget has been added using
* {@link #add(Widget)}.
*
* @param autoHide <code>true</code> if the dialog should be automatically
* hidden when the user clicks outside of it
*/
public MyDialogBox(boolean autoHide) {
this(autoHide, true);
}
/**
* Creates an empty dialog box specifying its "auto-hide" property. It should
* not be shown until its child widget has been added using
* {@link #add(Widget)}.
*
* @param autoHide <code>true</code> if the dialog should be automatically
* hidden when the user clicks outside of it
* @param modal <code>true</code> if keyboard and mouse events for widgets not
* contained by the dialog should be ignored
*/
public MyDialogBox(boolean autoHide, boolean modal)
{
super(autoHide, modal);
cross.addClickHandler(crosshandler);
cross.addMouseOutHandler(crosshandler);
cross.addMouseOverHandler(crosshandler);
captionPanel.add(caption);
captionPanel.add(cross);
captionPanel.setStyleName("caption");
Element td = getCellElement(0, 1); // Get the cell element that holds the caption
td.setInnerHTML(""); // Remove the old caption
td.appendChild(captionPanel.getElement());
}
@Override
public void setText(String text)
{
caption.setText(text);
}
public String getText()
{
return caption.getText();
}
public void setHtml(String html)
{
caption.setHTML(html);
}
public String getHtml()
{
return caption.getHTML();
}
Примечание: Этот код не работает. ClickEvent не отправляется из cross
, а вместо этого из MyDialogBox, независимо от того, добавляете ли вы ClickHandlers в cross
или нет, IOW MyDialogBox является отправителем / источником, и поэтому невозможно проверить на cross
. При нажатии на крестик по некоторым причинам не срабатывает ClickEvent.
Edit:
Похоже, что это не может быть сделано без хаков, если вы не напишите свой собственный DialogBox (почти) с нуля или исправите проблему 1405. Конечно, есть ряд существующих библиотек, которые уже решили эту проблему, то есть SmartGWT и GWT-Ext , но их реализация в основном производится с нуля.
Итак, чтобы ответить на ваш вопрос в одном предложении: Да, есть способ, но он вам не понравится:)