2011-12-20 78 views
2

我有一个按钮,它将无序列表项插入到JTextPane中。然而,当我点击按钮来插入一个列表项目时,插入两个项目符号而不是一个。仅在首次插入时插入一颗子弹。JTextPane中的双列表项插入

我从我的应用程序中删除了功能,并将代码粘贴到一个小的SSCCE(下图),问题依然存在。有没有人有任何想法可能会发生在这里?

[问题已解决,下面是完整解决的代码。有两种方法可以做到这一点,请参阅节目中的功能和项目符号按钮]

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.HeadlessException; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 

import javax.swing.JButton; 
import javax.swing.JEditorPane; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextPane; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.Element; 
import javax.swing.text.ElementIterator; 
import javax.swing.text.html.HTML; 
import javax.swing.text.html.HTMLDocument; 
import javax.swing.text.html.HTMLEditorKit; 

public class Main { 

    private static Button2 show = new Button2 ("Show"); 
    private static LIButton bullets = new LIButton("Bullets", HTML.Tag.UL); 
    private static JEditorPane pane = new JEditorPane(); 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       create(); 
      } 
     }); 
    } 

    private static void create() throws HeadlessException { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pane.setPreferredSize(new Dimension(300, 300)); 
     pane.setContentType("text/html"); 
     frame.add(pane, BorderLayout.CENTER); 
     JPanel panel = new JPanel(); 
     panel.add(bullets); 
     panel.add(show); 
     frame.add(panel, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    static class LIButton extends JButton { 

     static final String LI_HTML = "<HTML><BODY><UL><LI></LI></UL></BODY></HTML>"; 

     public LIButton(String name, HTML.Tag parent) { 
      super(new HTMLEditorKit.InsertHTMLTextAction(
       name, LI_HTML, HTML.Tag.UL, HTML.Tag.LI, HTML.Tag.BODY, HTML.Tag.UL)); 
     } 
    } 

    static class Button2 extends JButton implements ActionListener { 

     static final String LI_HTML = "<HTML><BODY><UL><LI></LI></UL></BODY></HTML>"; 

     public Button2(String name) { 
      super(name); 
      this.addActionListener(this); 
     } 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
      HTMLDocument doc = (HTMLDocument) pane.getDocument(); 
      HTMLEditorKit kit = (HTMLEditorKit) pane.getEditorKit(); 

      try { 
       kit.insertHTML(doc, doc.getLength() - 1, LI_HTML, 0, 1, null); 
      } catch (BadLocationException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 
+4

我从来没有能够了解如何添加HTML,但我猜想,你的文本字符串不应包含HTML和BODY标签,但是对于列表项只有文字/标签? – camickr 2011-12-20 05:06:20

+0

真的! Javadocs并没有让它变得更简单。我修改了上面的代码以包含解决方案。 – user396089 2011-12-20 10:27:09

+0

trashgod的解决方案更符合您的发布解决方案。正如我已经建议的那样,插入包含HTML和BODY标签的字符串是没有意义的。只有原始文本字符串应该包含这些标签。插入到文档应包含您要插入的新标签。 – camickr 2011-12-20 16:01:41

回答

2

下面的示例似乎有效。

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.HeadlessException; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextPane; 
import javax.swing.text.html.HTML; 
import javax.swing.text.html.HTMLEditorKit; 

public class Main { 

    private static LIButton bullets = new LIButton("Bullets", HTML.Tag.UL); 
    private static JTextPane pane = new JTextPane(); 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       create(); 
      } 
     }); 
    } 

    private static void create() throws HeadlessException { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pane.setPreferredSize(new Dimension(300, 300)); 
     pane.setContentType("text/html"); 
     pane.setText("<HTML><BODY><UL></UL></BODY></HTML>"); 
     frame.add(pane, BorderLayout.CENTER); 
     JPanel panel = new JPanel(); 
     panel.add(bullets); 
     frame.add(panel, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    static class LIButton extends JButton { 

     static final String LI_HTML = "<LI>item</LI>"; 

     public LIButton(String name, HTML.Tag parent) { 
      super(new HTMLEditorKit.InsertHTMLTextAction(
       name, LI_HTML, parent, HTML.Tag.LI)); 
     } 
    } 
} 
+0

谢谢,我还找到了一种替代方法。请参阅上例(已编辑以反映解决方案)中的'show'按钮 – user396089 2011-12-20 10:27:46

+1

+1,仅用于插入LI标签。 – camickr 2011-12-20 15:58:42