2011-12-20 75 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