Кнопка GET Close в строке заголовка диалогового окна

== тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).

.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. Строковые литералы :

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

blockquote>

. Подобные примеры также можно найти в JLS 3.10.5-1 .

13
задан Organiccat 29 May 2009 в 15:16
поделиться

5 ответов

Более простое решение - использовать gwt-ext ( http://code.google.com / p / gwt-ext / ). Это бесплатно, легко использовать и интегрировать. Вы можете увидеть их витрину http://www.gwt-ext.com/demo/ . Я думаю, что вам нужно MessageBox или окно макета (они находятся в категории Windows витрины).

С уважением.

5
ответ дан 1 December 2019 в 17:34
поделиться

Да, есть

Нет, нет - по крайней мере, не без возни с самим классом 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 , но их реализация в основном создается с нуля.

Итак, чтобы ответить на ваш вопрос одним предложением: Да, есть способ, но он вам не понравится :)

2
ответ дан 1 December 2019 в 17:34
поделиться

Вы можете найти закрываемое диалоговое окно в коде Google в проекте synthfuljava. На самом деле это называется прокручиваемым диалоговым окном с кнопкой закрытия X в заголовке.

В следующем блоге объясняются препятствия, которые необходимо было преодолеть, чтобы кнопка X с заголовком могла прослушивать событие click, чтобы оно работало:

http://h2g2java.blessedgeek.com/2009/07/gwt-useable-closeable-scrollable.html

0
ответ дан 1 December 2019 в 17:34
поделиться

Мы использовали 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 (), просто вызвав супер метод (они защищены).

Я считаю, что мне не разрешено помещать сюда наш исходный код, поэтому я просто могу дать вам эти советы.

17
ответ дан 1 December 2019 в 17:34
поделиться

Вы можете сделать это, добавив кнопку на центральную панель 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);
}
11
ответ дан 1 December 2019 в 17:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: