JOptionPane:忽略 HTML 中的换行符

问题描述 投票:0回答:1

我可以让 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>");
    }
}

a line feed is included, Hello is displayed

注意 HTML 文本来自数据库,我无法阻止此类输入。此外,无论如何它都是一个有效的 HTML,所以没有什么需要清理的。除非我误解了 spec,否则在 HTML 渲染期间所有空白都必须被忽略。像this这样的在线渲染器解析它也没有问题。

HTML with a line feed is rendered alright in an online editor

是否有解决此问题的方法,无需手动替换所有换行以使 Swing 满意?

Java 8。

java swing
1个回答
0
投票

问题在于

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>"));
© www.soinside.com 2019 - 2024. All rights reserved.