Отсутствующие пробелы / табуляции в JTextPane с содержимым HTML
У меня есть два разных JTextPanes, первый - это журнал, куда разные потоки отправляют сообщения. Сохраненные сессии хранятся в html- файлах, эти файлы используются в качестве содержимого второй JTextPane, когда пользователь загружает их. Оба JTextPanes имеют тип содержимого HTML
На первом JTextPane я вставляю новые строки прямо в StyledDocument
с insertString()
метод. Все хорошо, все пробелы и таблицы верны (до и после "OFFLINE"
тег):
Вот изображение части html- файла из NotePad++ с функцией "Показать все символы":
Таблицы и пробелы все еще там.
Однако, когда я загружаю этот файл обратно и передаю его второму JTextPane, он выглядит так:
Табуляции и пробелы ушли. Я пытался использовать  
вместо простых пробелов, но результат тот же.
Второй код 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());
}
Если я открою html- файл с помощью Mozzila, таблицы и пробелы также исчезнут.
Как это можно решить, что мне здесь не хватает?
Обновление Как видно из ответа 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();
}
}
Проверьте входные данные, скопируйте их в текстовый файл и сохраните как 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>
,
1 ответ
... имеет тип содержимого html.. Таблицы и пробелы исчезли.
Да. Это сделало бы это.
Если соответствующий текст не был завернут в <pre>
а также </pre>
для обозначения предварительно отформатированного раздела текста пробелы нормализуются, а вкладки игнорируются.