java - 带有 HTML 内容的 JTextPane 中缺少空格/表格

标签 java html swing jtextpane pre

我有两个不同的JTextPanes,第一个是不同线程发送消息的日志。 html 文件中保存了 session ,这些文件在用户加载它们时用作第二个JTextPane 的内容。两个 JTextPanes 都有 html 内容类型。

在第一个 JTextPane 中,我将新行直接插入到 StyledDocument 中与 insertString()方法。 一切都很好,所有空格和表格都是正确的(在 "OFFLINE" 标记之前和之后): enter image description here

这是NotePad++的html文件的一部分的图片,带有显示所有字符功能: enter image description here

表格和空格仍然存在。

但是,当我加载回该文件并将其传递给第二个 JTextPane 时,它​​看起来像这样: enter image description here

表格和空格都不见了。我试过使用 &nbsp而不是简单的空格,但结果是一样的。

第二个 JTextPane 的代码:

    //settings
    eventLogHistory = new JTextPane();
    eventLogHistory.setEditable(false);
    eventLogHistory.setName("eventLogHistory");
    eventLogHistory.setContentType("text/html");

加载代码:

File f=new File(directory+"eventlog.html");
if(f.exists()) 
{
    Scanner scan = new Scanner(f);
    String strtmp=new String();

    strtmp=scan.nextLine();
    strbld.append(strtmp+"\n");

    while(scan.hasNextLine()) 
    {
        strtmp=scan.nextLine();
        strbld.append(strtmp+"\n");
    }
    scan.close();

    getEventLogHistory().setText(strbld.toString());            
}

如果我用 Mozzila 打开 html 文件,表格和空格也会消失。

这怎么能解决,我在这里错过了什么?

更新Andrew Thompson中可以看出我错过了的回答 <pre>标签,感谢您提供有用的信息。然而,这些标签打破了线条并从包装文本中删除了所有样式。以下 MCVE 和样本输入模仿了这个问题。

所以新的问题是:我怎样才能避免之前描述的 <pre> 的行为?标签?

MCVE:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.DefaultCaret;

public class TextPaneWithHTML
{
    public TextPaneWithHTML()
    {
        final JFrame frame = new JFrame("JTextPane with HTML content");

        final JTextPane eventLogHistory = new JTextPane();
        eventLogHistory.setEditable(false);
        eventLogHistory.setName("eventLogHistory");
        eventLogHistory.setContentType("text/html");
        eventLogHistory.setForeground(Color.BLACK);

        JScrollPane messageTextScrollPane= new JScrollPane( eventLogHistory );
        messageTextScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        DefaultCaret caretMessageText = (DefaultCaret)eventLogHistory.getCaret();
        caretMessageText.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

        final JFileChooser fc = new JFileChooser();

        JButton loadButton = new JButton("Load content");
        loadButton.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent arg0) 
            {
                StringBuilder strbld=new StringBuilder();

                int returnval=fc.showOpenDialog(frame);

                if (returnval == 0) 
                {                   
                    File f = fc.getSelectedFile();
                    try 
                    {
                        if(f.exists()) 
                        {
                            Scanner scan = new Scanner(f);
                            String strtmp=new String();

                            while(scan.hasNextLine()) 
                            {
                                strtmp=scan.nextLine();
                                strbld.append(strtmp+System.getProperty("line.separator"));

                            }
                            scan.close();

                            eventLogHistory.setText(strbld.toString());         
                        }           
                    } 
                    catch (IOException e)
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }   
        });



        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
        frame.setSize(1200, 700);
        frame.getContentPane().add(messageTextScrollPane, BorderLayout.CENTER);
        frame.getContentPane().add(loadButton, BorderLayout.NORTH);

        frame.setVisible(true);

    }

    public static void main(String[] args)
    {
        new TextPaneWithHTML();
    }

}

测试输入,将其复制到一个txt文件中并另存为html:

<html>
 <head> 
 <style type="text/css"> 
.red{ color:#ff0000; }.blue{ color:#0000ff; }.green{ color:#33ff33; }.CLIgreen{ color:#02f002; }.khaki{ color:#8f8fff; }.white{ color:#ffffff; }.yellow{ color:#ffff00; }.pink{ color:#ff00ff; }.grey{ color:#d3d3d3; }.orange{ color:#ffc800; }p{ font-family: arial; font-size: 10; font-weight: bold; margin:0; } 
pre {
display:inline
}
 </style> 
 </head> 
<body>

<p><font class="white">[2014.11.17., 12:38:10]:  </font><font class="khaki">[TN-11111111]  [11111111]:  [cp1]   </font><font class="grey"><pre>OFFLINE          </pre></font><font class="white">  ----  </font><font class="green">SLAVE</font><font class="blue"></font></p>
<p><font class="white">[2014.11.17., 12:38:10]:  </font><font class="khaki">[TN-11111111]  [11111111]:  [cp2]   </font><font class="grey">OFFLINE          </font><font class="white">  ----  </font><font class="blue">MASTER</font>      
</p>
<p><font class="white">[2014.11.17., 12:38:10]:  </font><font class="khaki">[TN-11111111]  [11111111]:  [Clock] </font><font class="grey">OFFLINE          </font><font class="white">  ----  </font><font class="green">LOCKED</font><font class="blue"></font></p>
<p><font class="white">[2014.11.17., 12:38:10]:  </font><font class="khaki">[TN-11111112]  [11111112]:  [cp3]   </font><font class="grey">OFFLINE          </font><font class="white">  ----  </font><font class="green">SLAVE</font><font class="blue"></font></p>
<p><font class="white">[2014.11.17., 12:38:10]:  </font><font class="khaki">[TN-11111112]  [11111112]:  [cp4]   </font><font class="grey">OFFLINE          </font><font class="white">  ----  </font><font class="yellow">PASSIVE</font><font class="blue"></font></p>
<p><font class="white">[2014.11.17., 12:38:10]:  </font><font class="khaki">[TN-11111112]  [11111112]:  [cp2]   </font><font class="grey">OFFLINE          </font><font class="white">  ----  </font><font class="blue">MASTER</font>      
</p>
<p><font class="white">[2014.11.17., 12:38:10]:  </font><font class="khaki">[TN-11111112]  [11111112]:  [cp1]   </font><font class="grey">OFFLINE          </font><font class="white">  ----  </font><font class="blue">MASTER</font>      
</p>

  </body>
</html>

<pre>标签仅适用于第一行和 <pre> 处的换行符和 </pre> .

最佳答案

..has html content type .. Tabulations and spaces are gone.

是的。那样就可以了。

除非相关文本被包裹在<pre>中和 </pre>表示文本的预格式化部分,空格被规范化,制表符被忽略。

关于java - 带有 HTML 内容的 JTextPane 中缺少空格/表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26970449/

相关文章:

java - JUnit 测试公共(public)方法对非公共(public)字段的影响

java - 提高 MongoDB 查询性能

javascript - 响应式侧边菜单

java - JAVA中HTTP POST和GET请求+Javascript调用的结合?

java - 卡住 Java JComponent

java - 使用 netbeans 时向 JTable 添加数据

java - BlackBerry 布局管理器问题,虚拟大小

java - 如何使索引小于大小

javascript - 为什么当我点击页面时 setTimeout/setInterval 速度变慢?

java - 标签重新排列