2013-03-14 50 views
3

我正在使用StyleDocument在JTextPane中显示我的内容。 我搜索了一会儿,看到我可以用HTMLEditorKit将我从文本窗格获得的文档写入文件。但是当我想用HTMLEditorKit读取这个文件时,它不会在正确的文档中解析。我得到两个不同的结果:如何将html加载到样式文件

  1. 我得到的纯HTML代码在我textpane
  2. 我没有得到任何内容,我textpane

保存:

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); 
+1

如果您想在Java应用程序中呈现任意的HTML,这可能是一个更好的主意o使用像WebKit这样的“真正的”HTML引擎。 JavaFX在WebView中包含一个绑定:http://docs.oracle.com/javafx/2/webview/jfxpub-webview.htm – millimoose 2013-03-14 19:39:41

+0

这里是故事,..我最初插入一些格式化的文本(比如标题等的粗体) ) - 现在用户可以添加一些更多的文本,然后我想保存这种格式的文本..我不想显示一个HTML文件或类似的东西 – 2013-03-15 09:43:08

+0

你写保存的文件后,你检查它。用浏览器打开并查看它是否正确显示。你也可能想使用inputstreamreader进行编码。 http://docs.oracle.com/javase/tutorial/i18n/text/stream.html – btevfik 2013-03-19 08:06:01

回答

1

当你初始化你的JTextPane添加以下行:textpane.setContentType("text/html");

变化保存看起来像这样:

Document document = textpane.getStyledDocument(); 
EditorKit kit = textpane.getEditorKit(); 
kit.write(new FileOutputStream(new File("path")), doc, 0, doc.getLength()); 

变化加载看起来像这样:

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

例如考虑代码演示给出如下:

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