как загрузить html в styledocument

Я использую StyleDocument для отображения своего контента в JTextPane. Я некоторое время искал и увидел, что с помощью HTMLEditorKit я могу написать документ, который я получаю из текстовой панели, в файл. Но когда я хочу прочитать этот файл с помощью HTMLEditorKit, он не анализирует нужный документ. Я получаю два разных результата:

  1. Я получаю простой HTML-код в своей текстовой панели
  2. Я не получаю содержимое в своей текстовой панели

Сохранение:

Document doc = textpane.getStyledDocument();
HTMLEditorKit kit = new HTMLEditorKit();
kit.write(new FileOutputStream("path"), doc, 0, doc.getLength());

Загрузка (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);

person Christian 'fuzi' Orgler    schedule 14.03.2013    source источник
comment
Если вы хотите отображать произвольный HTML-код в приложении Java, вероятно, лучше использовать настоящий HTML-движок, такой как WebKit. JavaFX включает привязку для него в WebView: docs.oracle.com/javafx /2/веб-просмотр/jfxpub-webview.htm   -  person millimoose    schedule 14.03.2013
comment
Вот история. Сначала я вставляю некоторый форматированный текст (например, полужирный для заголовков и т. д.) - теперь пользователь может добавить еще текст, затем я хочу сохранить этот текст С форматом. Я не хочу отображать html-файл или что-то в этом роде   -  person Christian 'fuzi' Orgler    schedule 15.03.2013
comment
Вы проверяли сохраненный файл после того, как он был записан в него. откройте в браузере и посмотрите, правильно ли он отображается. также вы можете использовать inputstreamreader для кодирования. docs.oracle.com/javase/tutorial/i18n/text/stream. html   -  person btevfik    schedule 19.03.2013


Ответы (4)


Когда вы инициализируете JTextPane, добавьте следующую строку: textpane.setContentType("text/html");

Измените Сохранение следующим образом:

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, однако вы можете изменить это по своему усмотрению.

person nattyddubbs    schedule 21.03.2013

Вам необходимо установить тип содержимого JTextPane на "text/html" API JEditorPane. Это должно правильно отображать html.

person tjordan    schedule 21.03.2013

Я предполагаю, что вы не хотите менять код, написанный для сохранения. Так что пусть будет так, как есть.
Вам необходимо изменить код 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);

Например, рассмотрим демо-код, приведенный ниже:

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);
            }
        }
    }

}
person Vishal K    schedule 24.03.2013

Вы можете отобразить свой html в JEditorPane следующим образом:

    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);
    }
person Shikatsu    schedule 24.03.2013