2016-08-17 3 views
2

Доброе утро, дорогие, У меня есть JTextPane с типом контента 'text/html'. В этой JTextPane я загружаю Библию, где стихи разделяются тегом. Я хочу, чтобы определить выбранный вариант, когда пользователь нажимает на часть документа. С этого момента я могу получить выделенный текст с помощью метода getSelectedText(). Но результат не содержит теги исходного документа, которые могут помочь мне определить начало или конец стикета, в котором содержится выделенный текст.Получить теги выделенного текста в JTextPane

Я не могу сделать простой поиск, потому что метод getSelectedText() возвращает текст без тега. Например, результат

Abraham eut pour descendant <g v=\"Isaac\">Isaac</g>. 

будет «Авраамский эвр, потопите потомка Исаака». Итак, если я сделаю простой поиск, я ничего не найду. Итак, я хочу знать, как получить тег выделенного текста, чтобы я мог определить стили выбранного текста.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.text.*; 
import javax.swing.text.html.HTMLDocument; 
import javax.swing.text.html.HTMLEditorKit; 

public class VersetBibliques { 

    Rectangle[] rects = new Rectangle[2]; 
    HTMLEditorKit kit; 
    HTMLDocument htmlDoc;  

    private JPanel getContent() { 
     rects[0] = new Rectangle(); 
     rects[1] = new Rectangle(); 
     JPanel panel = new JPanel(new GridLayout(1, 0, 10, 0)); 
     panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     panel.add(new JScrollPane(getTextPane())); 
     return panel; 
    } 

    private JTextPane getTextPane() { 
     JTextPane textPane = new JTextPane(); 
     kit = new HTMLEditorKit(); 
     htmlDoc = new HTMLDocument(); 
     textPane.setEditable(false); 

     textPane.setEditorKit(kit); 
     textPane.setDocument(htmlDoc); 
     textPane.setContentType("text/html"); 
     textPane.setBackground(Color.WHITE); 
     textPane.setFont(new Font("Arial Bold", Font.ITALIC, 38)); 
     try { 
      kit.insertHTML(htmlDoc, 0, text, 0, 0, null);     
     } catch (BadLocationException e) { 
      System.out.println("bad location: " + e.getMessage()); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     textPane.addMouseListener(selector); 
     Style s = htmlDoc.addStyle("logical", null); 
     StyleConstants.setFontFamily(s, "georgia"); 
     StyleConstants.setFontSize(s, 58); 
     s = htmlDoc.addStyle("lineSpace", null); 
     StyleConstants.setLineSpacing(s, 0.25f); 
     htmlDoc.setLogicalStyle(0, htmlDoc.getStyle("logical")); 
     return textPane; 
    } 

    public static void main(String[] args) { 
     VersetBibliques test = new VersetBibliques(); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(test.getContent()); 
     f.setSize(600, 400); 
     f.setLocation(200, 200); 
     f.setVisible(true); 
    } 

    private MouseListener selector = new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      try { 
       JTextPane textPane = (JTextPane) e.getComponent(); 
       int start = textPane.getSelectionStart() - 10; 
       int end = textPane.getSelectionEnd() + 10; 

       textPane.setSelectionEnd(end); 
       textPane.setSelectionStart(start); 

       String selectedText = textPane.getSelectedText(); 
       System.out.println("text content : " + selectedText);//Il faudra faire le test avec Jean 11:35 
       System.out.println("start: "+start+"- end:"+end); 


      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
    }; 

    String text = "<mt>Évangile selon Matthieu</mt>\n" 
      + "<c><cn>1</cn>\n" 
      + "<mt>Naissance et enfance de Jésus</mt><s>La généalogie de Jésus</s><r>(<ref v=\"LUK3.23-38\">Lc 3.23-38</ref>)</r><v><vn>1</vn>Voici la généalogie de Jésus-Christ, de la descendance de <g v=\"David\">David</g> et d'<g v=\"Abraham\">Abraham</g>. </v>" 
      + "<p/><v><q><vn>2 </vn>Abraham eut pour descendant <g v=\"Isaac\">Isaac</g>.<br/>Isaac eut pour descendant <g v=\"Jacob\">Jacob</g>.<br/>Jacob eut pour descendant <g v=\"Juda\">Juda</g> et ses frères.</q></v>" 
      + "<v><q><vn>3 </vn>De Thamar, Juda eut pour descendant Péretz et Zérah.<br/>Péretz eut pour descendant Hetsrom.<br/>Hetsrom eut pour descendant Aram.</q></v>" 
      + "<v><q><vn>4 </vn>Aram eut pour descendant Aminadab.<br/>Aminadab eut pour descendant Nahchôn,<br/>Nahchôn eut pour descendant Salma.</q></v>" 
      + "<v><q><vn>5 </vn>De Rahab, Salma eut pour descendant Booz.<br/>De Ruth, Booz eut pour descendant Obed.</q></v></c>"; 

} 

Заранее спасибо

ответ

0

Для чтения HTML из документа, вам нужно использовать HTMLEditorKit. Особенно метод write.

Чтобы получить выбор смещения, вам нужно использовать getSelectionStart и getSelectionEnd или просто getCaretPosition из JTextPane

Чтобы получить разметку вокруг этих смещений, вы можете использовать getCharacterElement().getStartOffset() и getCharacterElement().getEndOffset() из HTMLDocument.

Наконец, вот пример, чтобы показать вам, как использовать эти:

package test; 

import java.awt.BorderLayout; 
import java.io.IOException; 
import java.io.StringReader; 
import java.io.StringWriter; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JTextPane; 
import javax.swing.SwingUtilities; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.html.HTMLDocument; 
import javax.swing.text.html.HTMLEditorKit; 

public class Test { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 

       String text = "<p><mt>Évangile selon Matthieu</mt>\n" 
         + "<c><cn>1</cn>\n" 
         + "<mt>Naissance et enfance de Jésus</mt><s>La généalogie de Jésus</s><r>(<ref v=\"LUK3.23-38\">Lc 3.23-38</ref>)</r><v><vn>1</vn>Voici la généalogie de Jésus-Christ, de la descendance de <g v=\"David\">David</g> et d'<g v=\"Abraham\">Abraham</g>. </v>" 
         + "<p/><v><q><vn>2 </vn>Abraham eut pour descendant <g v=\"Isaac\">Isaac</g>.<br/>Isaac eut pour descendant <g v=\"Jacob\">Jacob</g>.<br/>Jacob eut pour descendant <g v=\"Juda\">Juda</g> et ses frères.</q></v>" 
         + "<v><q><vn>3 </vn>De Thamar, Juda eut pour descendant Péretz et Zérah.<br/>Péretz eut pour descendant Hetsrom.<br/>Hetsrom eut pour descendant Aram.</q></v>" 
         + "<v><q><vn>4 </vn>Aram eut pour descendant Aminadab.<br/>Aminadab eut pour descendant Nahchôn,<br/>Nahchôn eut pour descendant Salma.</q></v>" 
         + "<v><q><vn>5 </vn>De Rahab, Salma eut pour descendant Booz.<br/>De Ruth, Booz eut pour descendant Obed.</q></v></c></p>"; 

       final JFrame mainFrame = new JFrame("test"); 
       mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       final JTextPane field = new JTextPane(); 
       field.setContentType("text/html"); 

       HTMLEditorKit kit = (HTMLEditorKit) field.getEditorKit(); 
       HTMLDocument doc = (HTMLDocument) field.getDocument(); 

       try (StringReader r = new StringReader(text)) { 
        kit.read(r, field.getDocument(), 0); 
       } catch (IOException | BadLocationException ex) { 
        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
       } 

       field.setCaretPosition(10); 
       field.setSelectionStart(doc.getCharacterElement(field.getCaretPosition()).getParentElement().getStartOffset()); 
       field.setSelectionEnd(doc.getCharacterElement(field.getCaretPosition()).getParentElement().getEndOffset()); 

       try (StringWriter w = new StringWriter()) { 
        kit.write(w, field.getDocument(), field.getSelectionStart(), field.getSelectionEnd()-field.getSelectionStart()); 
        System.out.println(w.toString()); 
       } catch (IOException | BadLocationException ex) { 
        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
       } 

       mainFrame.getContentPane().setLayout(new BorderLayout()); 
       mainFrame.getContentPane().add(field,BorderLayout.CENTER); 
       mainFrame.setSize(500,500); 
       mainFrame.setVisible(true); 
      } 
     }); 
    } 
} 

Тогда вы все еще есть некоторые проблемы, чтобы исправить, как и тот факт, что не-HTML разметка не будет корректно представленной JTextPane, поэтому вам нужно исправить ViewFactory, чтобы создать свой собственный XMLViewFactory, но это другой вопрос.

+0

Большое спасибо. Это именно то, что я хочу. А что касается использования моей собственной разметки, не могли бы вы дать мне хорошую ссылку на управление ViewFactory и XMLVievFactory. – Doukya

+1

http://java-sl.com/xml_editor_kit.html – StanislavL

+0

Как только проблема решена, выберите ответ. Это важно для того, чтобы это место работало. ;) – Sharcoux

Смежные вопросы