Habillage de texte HTML dans un JEditorPane à l'intérieur d'un JScrollPane

Dans une application, je suis en utilisant non modifiable JEditorPanes comme une sorte d'INTERFACE utilisateur générique widget qui peut afficher un peu de contenu complexe (HTML fera l'affaire), d'envelopper les lignes de texte et attraper les clics de la souris. Vous ne savez pas si JEditorPane est un bon choix, alors n'hésitez pas à suggérer d'autres solutions.

L'exemple de code suivant fonctionne assez bien:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
public class Main {
private static JPanel createPanel() {
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
for (int i = 0; i < 3; i++) {
JEditorPane editorPane = new JEditorPane();
editorPane.setEditable(false);
editorPane.setContentType("text/html");
String text =
"This is <b>item #" + i + "</b>." +
" It's got text on it that should be wrapped."
;
editorPane.setText(text);
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = i;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.weightx = 1.0;
constraints.insets.bottom = 5;
panel.add(editorPane, constraints);
}
return panel;
}
public static void main(String[] args) {
JPanel panel = createPanel();
JFrame frame = new JFrame();
frame.setSize(200, 200);
frame.setLocation(200, 200);
//Change this to switch between examples
boolean useScrollPane = false;
if (useScrollPane) {
JScrollPane scrollPane = new JScrollPane();
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setViewportView(panel);
frame.add(scrollPane);
}
else {
frame.add(panel);
}
frame.setVisible(true);
}
}

et le produit est le suivant:

Habillage de texte HTML dans un JEditorPane à l'intérieur d'un JScrollPane

Cependant, j'ai peut-être un grand nombre de ces et pourrait utiliser une barre de défilement verticale.

Alors, j'ai mis le tout dans un JScrollPane (modifier la useScrollPane variable true dans l'exemple de code pour voir cette version).

Cela me donne une barre de défilement verticale si je recule la hauteur de la fenêtre, mais le problème est que maintenant, le texte n'est plus enveloppé:

Habillage de texte HTML dans un JEditorPane à l'intérieur d'un JScrollPane

La question est donc: comment puis-je obtenir à la fois l'habillage du texte et la barre de défilement verticale?

Comme vous pouvez le voir, j'ai désactivé la barre de défilement horizontale, mais il n'a pas beaucoup d'aide.

PS. Je n'ai pas beaucoup d'expérience avec Swing, donc si vous voyez un débutant WTFs dans ce code, veuillez le signaler 🙂

OriginalL'auteur mjomble | 2011-03-02