Подтвердить что ты не робот

GWT: размещение необработанного HTML внутри метки

Есть ли способ разместить необработанный HTML внутри виджета Label с помощью GWT? Конструктор и методы setText() автоматически удаляют текст для HTML (поэтому < отображается как &lt; и т.д.).

Мне нужно что-то вроде:

String matched = "two";
List<String> values = Arrays.asList("one", "two", "three");
StringBuilder sb = new StringBuilder();
for (String v : values){
  if (v.equals(matched)){
    sb.append("<b>" + v + "<b>");
  } else {
    sb.append(v);
  }
  sb.append(", ");
}
Label label = new Label();
label.setRawText(sb.toString());
//div contains the following HTML: "one, <b>two</b>, three, "

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

4b9b3361

Ответ 1

Извините, я собираюсь ответить на свой вопрос, потому что нашел то, что искал.

Класс SafeHtmlBuilder идеален для этого. Вы говорите, какие строки вы хотите убежать и какие строки вы не хотите убегать. Он работает как StringBuilder, потому что вы вызываете методы append:

String matched = "two";
List<String> values = Arrays.asList("one", "two", "three <escape-me>");
SafeHtmlBuilder builder = new SafeHtmlBuilder();
for (String v : values){
  if (v.equals(matched)){
    builder.appendHtmlConstant("<b>");
    builder.appendEscaped(v);
    builder.appendHtmlConstant("</b>");
  } else {
    builder.appendEscaped(v);
  }
  builder.appendEscaped(", ");
}
HTML widget = new HTML();
widget.setHTML(builder.toSafeHtml());
//div contains the following HTML: "one, <b>two</b>, three &lt;escape-me&gt;, "

Обратите внимание, что метод appendHtmlConstant ожидает тег complete. Поэтому, если вы хотите добавить атрибуты к тегу, значения которого изменяются во время выполнения, это не сработает. Например, этот не будет работать (он выдает IllegalArgumentException):

String url = //...
SafeHtmlBuilder builder = new SafeHtmlBuilder();
builder.appendHtmlConstant("<a href=\""); //throws IllegalArgumentException
builder.appendEscaped(url);
builder.appendHtmlConstant("\">link</a>");

Ответ 2

Используйте класс HTML (или, скорее, это: класс InlineHTML вместо класса Label. InlineHTML работает как ярлык, за исключением того, что вы можете дать ему html.

И просто предупреждение о безопасности: если часть ввода вашего объекта InlineHTML вводится пользователем, не забудьте удалить html из этой части, чтобы пользователи не могли вставлять свои собственные скрипты в ваш код.

Ответ 3

Создайте ярлык и установите его жирным шрифтом:

Label label = new Label("text");
label.getElement().getStyle().setFontWeight(FontWeight.BOLD);

Или вы можете создать SpanElement и установить его innerHtml.

Ответ 4

Здесь пример для размещения пробела в виджетах, например. Метка:

public void setTextNbsp( final Widget w ) { 
    w.getElement().setInnerHTML( "&nbsp;" );
}

Также могут использоваться другие объекты HTML. Позаботьтесь об этом, чтобы не открывать отверстия для безопасности. SafeHtml и т.д., Возможно, потребуется рассмотреть, если сделать что-то более динамичное.

Ответ 5

Я думаю, вы должны использовать SpanElement, где вы не хотите, чтобы html был экранирован, и метка, где вы хотите, затем должна быть экранирована и помещена на вертикальную панель, чтобы они отображались как одна строка текста.