==
тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).
.equals()
тесты для равенства значений (независимо от того, являются ли они логически «равными»).
Objects.equals () проверяет наличие null
перед вызовом .equals()
, поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).
String.contentEquals () сравнивает содержимое String
с содержимым любого CharSequence
(доступно с Java 1.5).
Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals()
.
// These two have the same value
new String("test").equals("test") // --> true
// ... but they are not the same object
new String("test") == "test" // --> false
// ... neither are these
new String("test") == new String("test") // --> false
// ... but these are because literals are interned by
// the compiler and thus refer to the same object
"test" == "test" // --> true
// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true
// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true
Вы почти всегда хотите использовать Objects.equals()
. В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==
.
Из JLS 3.10. 5. Строковые литералы :
Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса
blockquote>String
. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя методString.intern
.. Подобные примеры также можно найти в JLS 3.10.5-1 .
Более простое решение - использовать gwt-ext ( http://code.google.com / p / gwt-ext / ). Это бесплатно, легко использовать и интегрировать. Вы можете увидеть их витрину http://www.gwt-ext.com/demo/ . Я думаю, что вам нужно MessageBox или окно макета (они находятся в категории Windows витрины).
С уважением.
Да, есть
Нет, нет - по крайней мере, не без возни с самим классом DialogBox GWT или путем воссоздания DialogBox с использованием обычных виджетов. Это известная проблема в GWT, также известная как проблема 1405 (Пометьте ее, чтобы показать свой интерес).
Однако; DialogBox не дает нам инструментов для этого, поэтому нам нужно его расширить - Изменить: это не работает.
Если вы хотите сделать замену DialogBox. вы можете назвать свой класс DialogBox и импортировать его вместо того, который включен в GWT. Эта ветка на форуме GWT дает более подробную информацию о том, как это можно сделать (устарело, использует слушателей). Устарело, внутренняя часть DialogBox была сильно изменена с момента создания этой ветки - это не работает .
Здесь ' s некоторый код, который я взломал, чтобы получить те же результаты (в качестве руководства использовал связанный поток) . Это не работает:
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 отправляется не из перекрестка
, а из MyDialogBox, независимо от того, добавляете ли вы ClickHandlers в перекресток
или нет, IOW MyDialogBox является отправителем / источником, поэтому проверить его невозможно. против кросса
. При щелчке крестика ClickEvent по некоторым причинам не запускается.
Изменить: t отправлено из cross
, но вместо этого из MyDialogBox, независимо от того, добавляете ли вы ClickHandlers в cross
или нет, IOW MyDialogBox является отправителем / источником и, следовательно, невозможно проверить на крест
. При щелчке крестика ClickEvent по некоторым причинам не запускается.
Изменить: t отправлено из cross
, но вместо этого из MyDialogBox, независимо от того, добавляете ли вы ClickHandlers в cross
или нет, IOW MyDialogBox является отправителем / источником и, следовательно, невозможно проверить на крест
. При щелчке крестика ClickEvent по некоторым причинам не запускается.
Изменить: Похоже, это невозможно сделать без хаков, если вы не напишете свой собственный DialogBox (почти) с нуля или не исправите проблему 1405. Конечно, есть ряд существующих библиотек, которые уже решили эту проблему, например SmartGWT и GWT-Ext , но их реализация в основном создается с нуля.
Итак, чтобы ответить на ваш вопрос одним предложением: Да, есть способ, но он вам не понравится :)
Вы можете найти закрываемое диалоговое окно в коде Google в проекте synthfuljava. На самом деле это называется прокручиваемым диалоговым окном с кнопкой закрытия X в заголовке.
В следующем блоге объясняются препятствия, которые необходимо было преодолеть, чтобы кнопка X с заголовком могла прослушивать событие click, чтобы оно работало:
http://h2g2java.blessedgeek.com/2009/07/gwt-useable-closeable-scrollable.html
Мы использовали GWT-ext с самого начала в нашем проекте. Это была плохая идея. У них много интересных виджетов, но они не являются виджетами GWT И у них нет совместимости с виджетами GWT. После того, как вы выберете GWT-Ext, все, даже механизм событий, должно быть в стиле GWT-Ext, а не в стиле GWT. Эта библиотека не будет обновляться для последней версии GWT, потому что библиотека Javascript Ext больше не является бесплатной. Сейчас мы удаляем GWT-Ext из нашего проекта.
Невозможно добавить другой виджет в заголовок GWT DialogBox, но вы можете расширить «DecoratedPanel» (это родительский элемент DialogBox). Изучите исходный код DialogBox, чтобы узнать о методах, особенно о том, как он добавляет объект Caption на панель и как реализуется перетаскивание окна.
Это то, что мы здесь сделали, и это работает очень хорошо. Мы создали наш собственный класс Caption, который расширяет FocusablePanel (SimplePanel, который фиксирует все события мыши), и мы добавили к нему HorizontalPanel с кнопками и текстом. Нам пришлось переопределить onAttach () и onDetach (), просто вызвав супер метод (они защищены).
Я считаю, что мне не разрешено помещать сюда наш исходный код, поэтому я просто могу дать вам эти советы.
Вы можете сделать это, добавив кнопку на центральную панель DialogBox:
Image closeButton = new Image("");
closeButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
registerBox.hide();
}
});
closeButton.setStyleName("TopRight");
Затем поместите ее с помощью CSS:
.TopRight {
float:right;
margin-top:-22px;
width:16px;
height:16px;
display:block;
background-image: url(images/cancel_16.png);
}