我可以让 Swing 的
JOptionPane
容忍 HTML 中的换行吗?例如,这显示字符串 hello
(如我所料)。
package demos.dialog.optionPane;
import javax.swing.JOptionPane;
public class JOptionPaneDemo {
public static void main(String[] args) {
JOptionPane.showMessageDialog(null, "<html>Hello</html>");
}
}
而此显示为
Hello</html>
package demos.dialog.optionPane;
import javax.swing.JOptionPane;
public class JOptionPaneDemo {
public static void main(String[] args) {
JOptionPane.showMessageDialog(null, "<html>\nHello</html>");
}
}
注意 HTML 文本来自数据库,我无法阻止此类输入。此外,无论如何它都是一个有效的 HTML,所以没有什么需要清理的。除非我误解了 spec,否则在 HTML 渲染期间所有空白都必须被忽略。像this这样的在线渲染器解析它也没有问题。
是否有解决此问题的方法,无需手动替换所有换行以使 Swing 满意?
Java 8。
问题在于
JOptionPane
不仅将文本渲染委托给像 JLabel
这样的另一个组件,而且本身具有多行支持,这会干扰其他文本处理。
例如
JOptionPane.showMessageDialog(null, "hello\nworld");
将使用两个 JLabel
实例渲染两行文本。
当您使用消息
"<html>\nHello</html>"
时,JOptionPane
会将其分成两“行”,"<html>"
和 "Hello</html>"
,并为每条线创建一个 JLabel
。第一个将启用 HTML 渲染,但不会产生任何可见内容,而第二个将禁用 HTML 渲染,以达到我们看到的结果。
解决方案是强制使用单个
JLabel
作为消息,将整个字符串作为一个 HTML 页面处理:
JOptionPane.showMessageDialog(null, new JLabel("<html>\nHello</html>"));