2010-09-06 14 views
0

J'essaye de créer une liste où les vignettes sont montrées pour un jEditorPane - semblable à comment dans powerpoint vous pouvez voir un aperçu de chaque glissière. Cependant, pour une raison quelconque, les images et les arrière-plans de mon éditeur sont rendus mais le texte ne l'est pas. Certains exemples de code:Création d'une vignette d'un jEditorPane, le texte n'est pas rendu

private void createThumbNailView(javax.swing.event.TreeSelectionEvent evt) {          

    JEditorPane test = new JEditorPane(); 
    JScrollPane jsp = new JScrollPane(); 

    test.setEditorKit(edkit); 
    test.setText("TEST TEXT - THIS WILL NOT BE RENDERED"); 
    test.setMargin(new java.awt.Insets(30, 30, 30, 60)); 

    jsp.setViewportView(test); 

    BufferedImage bi = new BufferedImage(300,250,BufferedImage.TYPE_INT_RGB); 
    test.paint(bi.getGraphics()); 
    jLabel1.setIcon(new ImageIcon(bi)); 
} 

j'ai trouvé que si j'utilise un JEditorPane qui est créé par Netbeans dans l'interface graphique, le rendu du texte fonctionne. Cependant, si j'en crée un nouveau (comme indiqué dans le code ci-dessus) avec le constructeur de base, alors le texte ne sera pas rendu. Cela me fait penser qu'il y a quelque chose dans la mise en page ou un code préparatoire que je dois inclure pour que le texte soit rendu. Chaque aide sera apprécié dans tous les cas!

Répondre

0

Je crois que le rendu des composants de texte est plus complexe que d'autres composants puisque vous devez analyser le texte et créer le document avant que le rendu puisse être fait. Je crois que le volet de l'éditeur peut utiliser un thread de fond ou un SwingUtilities.invokeLater() pour aider à ce processus.

Donc d'abord, essayez d'encapsuler le code de création d'image dans un SwingUtilities.invokeLater(). Ou si cela ne fonctionne pas, essayez de créer un thread séparé qui dort quelques millisecondes pour vous assurer que le volet de l'éditeur Document a été analysé avant de créer l'image.

+0

Je pensais que cela pourrait être le cas, jusqu'à ce que j'ai essayé de remplacer l'instance "test" du JEditorPane par celle que j'ai placée sur l'interface graphique (j'utilise NetBeans). Si j'utilise une instance de JEditorPane créée par NetBeans, je peux appeler setText, puis peindre dans la ligne de code suivante et il sera parfaitement rendu. Toutefois, si je crée une nouvelle instance comme dans le code ci-dessus, le problème de rendu du texte se produit. – evan

0

C'est moi, l'affiche originale de la question. Je l'ai compris - le problème était que je n'avais pas spécifié la taille du composant. Cela me fait vraiment sentir idiot que je n'avais pas remarqué cela plus tôt. Apparemment, Netbeans cache la partie dimensionnement des composants et j'ai donc supposé que le composant prendrait la taille préférée du composant par défaut. Cependant, après avoir creusé un peu plus profond, j'ai trouvé la taille du composant était 0 et donc il n'y avait vraiment rien rendu, sauf pour les images qui débordaient à l'extérieur du conteneur composant (effrayant!)