2015-06-15 12 views
0

Что я делаю неправильно здесь в пытается получить текст (с символами новой строки в своих местах) из компонента JTextPane с типом контента «текст/html»?Почему textPane.getDocument(). GetText() Возвращает пустую строку?

textPane.getText()возвращает HTML, но с пустымhead и body. textPane.getDocument().getText()возвращает пустую строку.

P.S .: У меня также нет строк и других проблем в том же коде, должен ли я спрашивать их как самостоятельные вопросы, с тем же кодом?

Код:

package test; 

import java.io.IOException; 
import java.io.StringReader; 
import java.net.URL; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JScrollPane; 
import javax.swing.text.BadLocationException; 
//import javax.swing.text.StyledEditorKit; 

public class TextPaneTester extends javax.swing.JFrame { 

    public TextPaneTester() { 
     initComponents(); 
     myInitComponents(); 
    } 

    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 
     contentScrollPane = new javax.swing.JScrollPane(); 
     content = new javax.swing.JTextPane(); 
     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     contentScrollPane.setViewportView(content); 

     // layout code by NetBeans 
    }// </editor-fold>       

    private void myInitComponents(){ 
     //content.setEditorKit(new StyledEditorKit()); 
     contentScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     contentScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
    } 

    private void fetchURL(String url){ 
     try{ 
      // URL(URL baseURL[, String relativeURL]) 
      URL helpURL = new URL(url); 
      System.out.println(helpURL); 
      this.content.setPage(helpURL); 

      try { 
       System.out.println("This far!"); 
       //System.out.println(this.content.getDocument()); 
       System.out.println("getDocument() on JTextPane gives " + this.content.getDocument()); 
       System.out.println("getText() on JTextPane gives " + this.content.getText()); 

       // Why this line retuens an empty string? 
       String text = this.content.getDocument().getText(0, this.content.getDocument().getLength()); 
       System.out.println("getDocument.getText() on JTextPane gives " + text); 

       System.out.println("This far 2!"); 
       // this.translation.setPage(helpURL); 
      } catch (BadLocationException ex) { 
       System.out.println("Why this far!"); 
       Logger.getLogger(TextPaneTester.class.getName()).log(Level.SEVERE, null, ex); 
      } 

     } 
     catch (IOException e) { 
      System.err.println("Attempted to read a bad URL: " + url); 
     } 
     // return this.content; 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(TextPaneTester.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       String url = "https://en.wikipedia.org/wiki/Virtaal"; 
       TextPaneTester reader = new TextPaneTester(); 
       reader.fetchURL(url); 
       reader.setVisible(true); 
      } 
     }); 
    } 

    private javax.swing.JTextPane content; 
    private javax.swing.JScrollPane contentScrollPane; 
    // End of variables declaration     
} 

Выход:

run: 
https://en.wikipedia.org/wiki/Virtaal 
This far! 
getDocument() on JTextPane gives [email protected] 
getText() on JTextPane gives <html> 
    <head> 

    </head> 
    <body> 
    <p style="margin-top: 0"> 

    </p> 
    </body> 
</html> 

getDocument.getText() on JTextPane gives 
This far 2! 
<html> 
    <head> 

    </head> 
    <body> 
    <p style="margin-top: 0"> 

    </p> 
    </body> 
</html> 

Let's see what the parser gives: 
BUILD SUCCESSFUL (total time: 55 seconds) 

ответ

3

Как обычно, documentation это первое место, вы должны смотреть:

Если документ загружен асинхронно, документ wi будет немедленно установлен в редактор, используя вызов setDocument, который будет запускать событие изменения свойства документа, после чего будет создан поток, который начнет выполнять фактическую загрузку. В этом случае событие изменения свойства страницы не будет запущено вызовом этого метода напрямую, но скорее будет запущено, когда поток, выполняющий загрузку, будет завершен. Он также будет запущен в потоке отправки событий.

Вы читаете документ до того, как страница закончила загрузку. Дождитесь загрузки путем мониторинга page свойство:

this.content.addPropertyChangeListener("page", 
    new PropertyChangeListener() { 
     @Override 
     public void propertyChange(PropertyChangeEvent event) { 
      System.out.println("getText() on JTextPane gives " 
       + content.getText()); 
     } 
    }); 

this.content.setPage(helpURL); 
+0

Спасибо, я прочитал документ, но я не получаю, что делать синхронные и асинхронные загрузки в виду? – devautor

+0

Кроме того, если кто-нибудь может ответить на P.S. частично, то есть, если я могу попросить дополнительную помощь по одному и тому же коду (проблема с переводом строки) только здесь или по независимому вопросу? – devautor

+0

Это должен быть отдельный вопрос с подробными сведениями о проблемах: Опишите, что вы видите, и что вы ожидали увидеть. Обратите внимание, что обычно для отображения HTML вы хотите использовать JEditorPane, а не JTextPane, и вы хотите вызвать setEditable (false) на нем. – VGR

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