Java Swing JTextPane text/html 不支持禁用属性

标签 java html swing awt jtextpane

我正在尝试在 JTextPane 中显示一个简单的 HTML 页面。该页面具有输入复选框/单选元素,但需要禁用它们。但是,当显示页面时,复选框和单选按钮仍处于启用状态。我不希望用户能够单击并更改其状态。这是一个错误还是我做错了什么。请帮忙。这是示例代码:

import javax.swing.*;
public class JEPTest {
    public static void main(String[] args) throws Exception{
        String data = "<html>\n" +
"\n" +
"<body>\n" +
"<input type='radio' disabled>\n" +
"\n" +
"</body>\n" +
"</html>";

    final JEditorPane textPane = new JEditorPane();
        textPane.setContentType("text/html");
        textPane.setEnabled(false);
        JScrollPane paneScrollPane = new JScrollPane(textPane);
        paneScrollPane.setVerticalScrollBarPolicy(
                        JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        paneScrollPane.setHorizontalScrollBarPolicy(
                        JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        //paneScrollPane.setPreferredSize(new Dimension(250, 155));
        paneScrollPane.setMinimumSize(new Dimension(100, 100));        


    JButton jb = new JButton("set");
    jb.addActionListener
        (
        new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
        textPane.setText(data);

        }
    }
        );

    JFrame jf = new JFrame();
    jf.setSize(800, 600);       

    jf.getContentPane().add(textPane, BorderLayout.CENTER);
    jf.getContentPane().add(jb, BorderLayout.SOUTH);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setVisible(true);

    }
}

最佳答案

Swing 使用旧的 HTML 渲染引擎,仅支持 HTML 3.2。 The HTML 3.2 specification揭示 <input>元素不允许 disabled该版本当时的属性。定义的属性是:

<!ATTLIST INPUT
        type %InputType TEXT     -- what kind of widget is needed --
        name  CDATA #IMPLIED     -- required for all but submit and reset --
        value CDATA #IMPLIED     -- required for radio and checkboxes --
        checked (checked) #IMPLIED -- for radio buttons and check boxes --
        size CDATA  #IMPLIED     -- specific to each type of field --
        maxlength NUMBER #IMPLIED
        src   %URL  #IMPLIED     -- for fields with background images --
        align %IAlign #IMPLIED   -- vertical or horizontal alignment --
        >

最好的解决方法是避免使用 JEditorPane 并仅在 JPanel 中创建 JCheckBox 实例。

或者,您可以使用 <object> 在 JEditorPane 的 HTML 文档中嵌入任何可视 Java bean,包括所有 JComponent 后代。元素。 javax.swing.text.html.ObjectView 中对此进行了描述。文档。

您可以使用此功能直接嵌入 JRadioButton。但是,只能以这种方式设置 String 属性,因此您必须创建自己的 JRadioButton 子类并添加一个包装 enabled 的 String 属性。属性:

public class JEPTest {
    public static class StringPropRadioButton
    extends JRadioButton {
        private static final long serialVersionUID = 1;

        public String getEnabledAsString() {
            return String.valueOf(isEnabled());
        }

        public void setEnabledAsString(String enabled) {
            setEnabled(Boolean.parseBoolean(enabled));
        }
    }

    public static void main(String[] args) throws Exception{
        String data = "<html>\n" +
        "\n" +
        "<body>\n" +
        "<input type='radio' disabled>\n" +
        "\n" +
        "<p>" +
            "<object classid='JEPTest$StringPropRadioButton' id='option1'>" +
            "    <param name='text' value='Option 1'>" +
            "    <param name='enabledAsString' value='false'>" +
            "</object>" +
        "</body>\n" +
        "</html>";

关于Java Swing JTextPane text/html 不支持禁用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60387525/

相关文章:

java - 如何确定哪些行在可滚动的 JTextArea 中可见?

java - 配置 JTable,以便仅当 MouseEvent 没有修饰符时才触发排序

java - java中的下拉菜单?

java - FileUtils.copyFile() VS FileChannel.transferTo()

html - 当元标记设置为 'content="IE= 7"' 时,HTML 页面上的 IE11 上未加载字体

java - FTP 看起来像 java/HTML 中的应用程序

jquery - 在 CSS 中扩展边框而不向下推其他元素

java - 使用按钮增加或减少 Swing 计时器速度?

java - 如何映射 URL 中包含斜线(通配符映射)

Java循环收集数组中每三个元素的第二个和第三个元素