GWT:将原始HTML放在Label中

时间:2011-10-07 20:00:16

标签: java gwt

有没有办法将原始HTML放在带有GWT的Label小部件中?构造函数和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, "

我想输出以逗号分隔的字符串列表,但我希望其中一个字符串加粗。感谢。

5 个答案:

答案 0 :(得分:11)

使用HTML类(或者更可能是:InlineHTML类而不是Label类.InlineHTML的工作方式与标签类似,但您可以将其赋予html。

只是一个安全警告:如果用户输入了InlineHTML对象的部分输入,请记住将html从该部分中删除,这样用户就无法将自己的脚本插入到代码中。

答案 1 :(得分:6)

对不起,我要回答我自己的问题,因为我找到了我要找的东西。

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方法需要完整标记。因此,如果要向运行时值更改的标记添加属性,则无法使用。例如,不会工作(它会抛出IllegalArgumentException):

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

答案 2 :(得分:3)

创建标签并将其设置为粗体:

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

或者您可以创建SpanElement并设置其innerHtml。

答案 3 :(得分:2)

以下是在窗口小部件中放置空格的示例,例如标签:

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

也可以使用其他HTML实体。注意这一点不要打开安全漏洞。如果做一些更动态的事情,可能需要考虑SafeHtml等。

答案 4 :(得分:0)

我认为你应该使用SpanElement,你不希望html被转义并标记你想要的地方然后被转义并将它们放在垂直面板上,这样它们就会显示为单行文本。