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

+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