如何将HTML加载到StyleDocument

4
我正在使用StyleDocument来在JTextPane中显示我的内容。 我搜索了一段时间,发现我可以使用HTMLEditorKit将我从textpane获取的文档写入文件。但是当我想用HTMLEditorKit读取这个文件时,它并没有正确解析成文档。我得到了两种不同的结果:
  1. 我在我的textpane中获得了纯html代码
  2. 我的textpane中没有任何内容
保存:
Document doc = textpane.getStyledDocument();
HTMLEditorKit kit = new HTMLEditorKit();
kit.write(new FileOutputStream("path"), doc, 0, doc.getLength());

Loading (2个版本):

HTMLEditorKit kit = new HTMLEditorKit();
Document doc = null;
Document doc2 = kit.createDefaultDocument();

kit.read(new FileInputStream("path"), doc, 0);
kit.read(new FileInputStream("path"), doc2, 0);

textpane.setDocument(doc);
textpane.setDocument(doc2);

1
如果您想在Java应用程序中呈现任意HTML,则最好使用像WebKit这样的“真正”的HTML引擎。 JavaFX在WebView中包含了它的绑定:http://docs.oracle.com/javafx/2/webview/jfxpub-webview.htm - millimoose
这是故事的背景,我最初插入了一些格式化文本(例如标题粗体等),现在用户可以添加一些文本,然后我想保存这个带有格式的文本。我不想显示HTML文件或类似的东西。 - Christian 'fuzi' Orgler
写入文件后,你是否检查了保存的文件?用浏览器打开并检查其是否正确显示。同时,你可能需要使用InputStreamReader来进行编码。http://docs.oracle.com/javase/tutorial/i18n/text/stream.html - btevfik
4个回答

2
当您初始化JTextPane时,请添加以下行:textpane.setContentType("text/html");Saving更改为以下内容:
Document document = textpane.getStyledDocument();
EditorKit kit = textpane.getEditorKit();
kit.write(new FileOutputStream(new File("path")), doc, 0, doc.getLength());

Loading 改为以下样式:

EditorKit kit = pane2.getEditorKit();
Document doc = kit.createDefaultDocument();
kit.read(new FileInputStream(new File("path")), doc, 0);
textpane.setDocument(doc);

在我的测试环境中,我可以使用JTextPane设置一些HTML文本,从面板获取HTML,将其写入文件,然后从同一文件中读取它。我没有看到任何理由使用HTMLEditorKit,因为您没有执行任何特定于HTML的操作,但是您可以根据需要更改。


0
您需要将JTextPane的内容类型设置为"text/html" JEditorPane API。然后,它应该正确显示HTML。

0

我猜你不想改变保存代码的编写方式。所以让它保持原样。
你需要按照以下方式更改LOADING代码:

HTMLEditorKit kit = new HTMLEditorKit();
StyledDocument doc2 = (StyledDocument)kit.createDefaultDocument();
kit.read(new FileInputStream(file), doc2, 0);
pane = new JTextPane();
pane.setEditorKit(kit);//set EditorKit of JTextPane as kit.
pane.setDocument(doc2);

例如,考虑下面给出的代码示例 Demo:
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class HTMLKit extends JFrame implements ActionListener{
     public static final String text = "As told by Wikipedia\n"
    +"Java is a general-purpose, concurrent, class-based, object-oriented computer programming language."
    + "It is specifically designed to have as few implementation "
    + "dependencies as possible. It is intended to let application developers write once, run anywhere (WORA), "
    + "meaning that code that runs on one platform does not need to be recompiled to run on another. "
    + "Java applications are typically compiled to bytecode (class file) that can run on any Java virtual "
    + "machine (JVM) regardless of computer architecture. Java is, as of 2012, one of the most popular programming "
    + "languages in use, particularly for client-server web applications, with a reported 10 million users.";
    JTextPane pane ;
    DefaultStyledDocument doc ;
    StyleContext sc;
    JButton save;
    JButton load;
    JScrollPane jsp;
    public static void main(String[] args) 
    {
        try 
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    HTMLKit se = new HTMLKit();
                    se.createAndShowGUI();
                }
            });
        } catch (Exception evt) {}
    }
    public void createAndShowGUI()
    {
        setTitle("TextPane");
        sc = new StyleContext();
        doc = new DefaultStyledDocument(sc);
        pane = new JTextPane(doc);
        save = new JButton("Save");
        load = new JButton("Load");
        JPanel panel = new JPanel();
        panel.add(save);panel.add(load);
        save.addActionListener(this);load.addActionListener(this);
        final Style heading2Style = sc.addStyle("Heading2", null);
        heading2Style.addAttribute(StyleConstants.Foreground, Color.red);
        heading2Style.addAttribute(StyleConstants.FontSize, new Integer(16));
        heading2Style.addAttribute(StyleConstants.FontFamily, "serif");
        heading2Style.addAttribute(StyleConstants.Bold, new Boolean(true));
        try 
        {
            doc.insertString(0, text, null);
            doc.setParagraphAttributes(0, 1, heading2Style, false);
        } catch (Exception e) 
        {
            System.out.println("Exception when constructing document: " + e);
            System.exit(1);
        }
        jsp = new JScrollPane(pane);
        getContentPane().add(jsp);
        getContentPane().add(panel,BorderLayout.SOUTH);
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent evt)
    {
        if (evt.getSource() == save)
        {
            save();
        }
        else if (evt.getSource() == load)
        {
            load();
        }
    }
    private void save()
    {
        JFileChooser chooser = new JFileChooser(".");
        chooser.setDialogTitle("Save");
        int returnVal = chooser.showSaveDialog(this);
        if(returnVal == JFileChooser.APPROVE_OPTION) 
        {
            File file = chooser.getSelectedFile();
            if (file != null)
            {
                try
                {
                    Document doc = pane.getStyledDocument();
                    HTMLEditorKit kit = new HTMLEditorKit();
                    kit.write(new FileOutputStream(file), doc, 0, doc.getLength());
                    JOptionPane.showMessageDialog(this,"Saved successfully!!","Success",JOptionPane.INFORMATION_MESSAGE);
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
            else 
            {
                JOptionPane.showMessageDialog(this,"Please enter a fileName","Error",JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    private void load()
    {
        JFileChooser chooser = new JFileChooser(".");
        chooser.setDialogTitle("Open");
        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int returnVal = chooser.showOpenDialog(this);
        if(returnVal == JFileChooser.APPROVE_OPTION) 
        {
            File file = chooser.getSelectedFile();
            if (file!= null)
            {
                try
                {
                    HTMLEditorKit kit = new HTMLEditorKit();
                    StyledDocument doc2 = (StyledDocument)kit.createDefaultDocument();
                    kit.read(new FileInputStream(file), doc2, 0);
                    JTextPane pane1 = new JTextPane();
                    pane1.setEditorKit(kit);
                    pane1.setDocument(doc2);
                    repaint();
                    jsp.setViewportView(pane1);
                    repaint();
                    JOptionPane.showMessageDialog(this,"Loaded successfully!!","Success",JOptionPane.INFORMATION_MESSAGE);
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
            else 
            {
                JOptionPane.showMessageDialog(this,"Please enter a fileName","Error",JOptionPane.ERROR_MESSAGE);
            }
        }
    }

}

0
您可以像这样在JEditorPane中显示您的HTML:
    private void AboutGame()
    {
        JEditorPane Log = CreateEditorPane("AboutGame.html");

        JScrollPane LogScrollPanel = new JScrollPane(Log);
        LogScrollPanel.setVerticalScrollBarPolicy
                            (JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        LogScrollPanel.setPreferredSize(new Dimension(800, 400));
        LogScrollPanel.setMinimumSize(new Dimension(10, 10));

        Object Message = LogScrollPanel;

        JOptionPane.showMessageDialog(null, 
                                          Message, "About Game", 1);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接