2011-12-20 7 views
2

私は、順序付けされていないリストアイテムをJTextPaneに挿入するボタンを持っています。しかし、リストアイテムを挿入するためにボタンをクリックすると、1つではなく2つの箇条書きが挿入されます。 1回の弾丸は、最初の挿入時にのみ挿入されます。ダブルリストJTextPaneでのアイテムの挿入

私のアプリケーションから機能を切り取り、コードを小さなSSCCE(以下)に貼り付けても問題は残ります。ここに何が起こっているのか誰にも分かりますか?

[問題は解決されました。以下は完全な解決コードです。これを行うには2通りの方法があります。

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

+0

本当ですか!そして、Javadocsはそれを少しでも簡単にしません。上記のコードを修正して、ソリューションを追加しました。 – user396089

+0

trashgodのソリューションは、投稿されたソリューションの方が意味があります。すでに提案したように、HTMLタグとBODYタグを含む文字列を挿入するのは意味がありません。元のテキスト文字列にのみこれらのタグを含める必要があります。ドキュメントへの挿入には、挿入する新しいタグが含まれている必要があります。 – camickr

答えて

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

+1

+1、LIタグを挿入するだけです。 – camickr

関連する問題