Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JEditorPane中保留空HTML行的格式_Java_Html_Swing_Jeditorpane - Fatal编程技术网

Java 在JEditorPane中保留空HTML行的格式

Java 在JEditorPane中保留空HTML行的格式,java,html,swing,jeditorpane,Java,Html,Swing,Jeditorpane,我注意到,当HTML窗格上出现空行时,所有以前设置的样式都将消失。例如,请参见下面的代码示例: import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.text.AttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.html.H

我注意到,当HTML窗格上出现空行时,所有以前设置的样式都将消失。例如,请参见下面的代码示例:

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.text.AttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.html.HTMLEditorKit;


public class BlankLineTester {
    private JEditorPane jep;

    public BlankLineTester() {
        String html = "<html><head></head><body>" +
                "<p><b>Line 1</b></p>" +
                "<p><b></b></p>" +
                "<p><b>Line 3</b></p>" +
                "</body></html>";

        jep = new JEditorPane();
        jep.setContentType("text/html");
        jep.setText(html);

        JFrame frame = new JFrame("Blank Line Test");
        frame.getContentPane().add(jep);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        System.out.println("Line 3 is " + isInputAttributeBold());

        jep.getCaret().setDot(8);
        System.out.println("Line 2 is " + isInputAttributeBold());

    }

    private boolean isInputAttributeBold() {
        AttributeSet attSet = ((HTMLEditorKit)jep.getEditorKit()).getInputAttributes();
        return StyleConstants.isBold(attSet);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new BlankLineTester();
            }
        });
    }
}
import javax.swing.JEditorPane;
导入javax.swing.JFrame;
导入javax.swing.SwingUtilities;
导入javax.swing.text.AttributeSet;
导入javax.swing.text.StyleConstants;
导入javax.swing.text.html.HTMLEditorKit;
公共类消隐测线仪{
私人绝地武士团;
公共BlankLineTester(){
字符串html=“”+
“第1行

”+ “

”+ “第3行

”+ ""; jep=新的JEditorPane(); setContentType(“text/html”); jep.setText(html); JFrame=新JFrame(“空行测试”); frame.getContentPane().add(jep); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); System.out.println(“第3行是”+isInputAttributeBold()); jep.getCaret().setDot(8); System.out.println(“第2行是”+isInputAttributeBold()); } 私有布尔值isInputAttributeBold(){ AttributeSet attSet=((HTMLEditorKit)jep.getEditorKit()).getInputAttribute(); 返回StyleConstants.isBold(attSet); } 公共静态void main(字符串[]args){ SwingUtilities.invokeLater(新的Runnable(){ @凌驾 公开募捐{ 新的BlankLineTester(); } }); } }
第2行最初设置为粗体空行,但在解析之后,似乎没有保留粗体属性。另外请注意,如果您自己运行此命令,将光标放在第3行,并删除该行中的所有内容,则您键入的下一个字符将不会是粗体。我想象,当它们所代表的文本消失时,HTMLDocument树中的叶子元素将被删除,但当用户运行它时,这开始看起来像是错误行为

有人知道如何让样式属性既在空行上解析,又在删除样式行上的所有内容时保留吗

谢谢!
--Andy

如果你这样写,那么我想你会得到你的行为,看起来b&/b,标记是老式的,尽管我使用的是JRE 1.7更新3,下面几行代码在这方面效果很好:

String html = "<html><head></head><body>" +
                "<p style = \"font-weight:bold\">Line 1</p>" +
                "<p style = \"font-weight:bold\"></p>" +
                "<p style = \"font-weight:bold\">Line 3</p>" +
                "</body></html>";
String html=“”+
“

第1行”+ “

”+ “

第3行”+ "";

尝试此代码,当您运行程序时,尝试通过将光标移到起始位置来按Delete键,然后它将保留颜色绿色,因为这是鼠标指针触到的最后一个字符的颜色,然后尝试通过将光标移到最末端来按Backspace键,然后它将保留颜色蓝色,因为这是鼠标指针触摸的最后一个字符的颜色。第三次,简单地试着在已经提供的两行之间的每行写一个单词,有一行将显示红色字符,试着找到那一行。我附上下面的图片,以澄清红线的情况

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.text.AttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.html.HTMLEditorKit;


public class BlankLineTester {
    private JEditorPane jep;

    public BlankLineTester() {
        String html = "<html><head></head><body>" +
                "<p style = \"font-weight:bold; color: blue\">Line 1</p><br />" +
                "<p style = \"font-weight:bold; color: red\"></p><br />" +
                "<p style = \"font-weight:bold; color: green\">Line 3</p>" +
                "</body></html>";

        jep = new JEditorPane();
        jep.setContentType("text/html");
        jep.setText(html);

        JFrame frame = new JFrame("Blank Line Test");
        frame.getContentPane().add(jep);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        System.out.println("Line 3 is " + isInputAttributeBold());

        jep.getCaret().setDot(8);
        System.out.println("Line 2 is " + isInputAttributeBold());

    }

    private boolean isInputAttributeBold() {
        AttributeSet attSet = ((HTMLEditorKit)jep.getEditorKit()).getInputAttributes();
        return StyleConstants.isBold(attSet);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new BlankLineTester();
            }
        });
    }
}
import javax.swing.JEditorPane;
导入javax.swing.JFrame;
导入javax.swing.SwingUtilities;
导入javax.swing.text.AttributeSet;
导入javax.swing.text.StyleConstants;
导入javax.swing.text.html.HTMLEditorKit;
公共类消隐测线仪{
私人绝地武士团;
公共BlankLineTester(){
字符串html=“”+
“

第1行


”+ “


”+ “

第3行”+ ""; jep=新的JEditorPane(); setContentType(“text/html”); jep.setText(html); JFrame=新JFrame(“空行测试”); frame.getContentPane().add(jep); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); System.out.println(“第3行是”+isInputAttributeBold()); jep.getCaret().setDot(8); System.out.println(“第2行是”+isInputAttributeBold()); } 私有布尔值isInputAttributeBold(){ AttributeSet attSet=((HTMLEditorKit)jep.getEditorKit()).getInputAttribute(); 返回StyleConstants.isBold(attSet); } 公共静态void main(字符串[]args){ SwingUtilities.invokeLater(新的Runnable(){ @凌驾 公开募捐{ 新的BlankLineTester(); } }); } }


+1为什么不将每个
p
中定义的样式移动到
主体
元素中?(我对OP想要实现的目标感到非常困惑,所以可能离目标很远。)不,你总是对的,这也是我想的,只是到目前为止与OP缺乏沟通,这就是为什么从来没有碰过这根弦。是的,我意识到标签是老派的,但是Swing中的HTML似乎来自同一个流派,如果将粗体属性应用于字符元素并序列化为HTML,就会写出这样的内容。您的方法很有趣-将属性应用于整个段落,但并不能完全满足我的需要,因为我将在段落中不统一的每一行中应用字符级属性。我将尝试更好地解释上面的问题。感谢您花时间处理这头奶牛,但您在段落级别添加了一种样式,即使字符消失,这种样式也会保留下来。然而,这迫使该段中的所有内容都具有这种风格,至少作为基础。我要找的是保留角色级别的样式。到