Java Swing JTextPane text/html 不支持禁用的属性
Java Swing JTextPane text/html not honoring disabled attribute
我正在尝试在 JTextPane 中显示一个简单的 HTML 页面。该页面有输入 checkbox/radio 元素,但需要禁用它们。但是,当页面显示时,复选框和单选按钮仍处于启用状态。我不希望用户能够单击并更改他们的状态。这是一个错误还是我做错了什么。请帮忙。这是示例代码:
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。但是,只能以这种方式设置字符串属性,因此您必须创建自己的 JRadioButton 子类并添加一个字符串 属性 来包装 enabled
属性:
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>";
我正在尝试在 JTextPane 中显示一个简单的 HTML 页面。该页面有输入 checkbox/radio 元素,但需要禁用它们。但是,当页面显示时,复选框和单选按钮仍处于启用状态。我不希望用户能够单击并更改他们的状态。这是一个错误还是我做错了什么。请帮忙。这是示例代码:
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。但是,只能以这种方式设置字符串属性,因此您必须创建自己的 JRadioButton 子类并添加一个字符串 属性 来包装 enabled
属性:
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>";