Bonjour,
Est-il possible d'afficher du texte HTML ou RTF dans une table en Java (pour un développement client riche) ?
Merci. Cordialement. Gilles
Version imprimable
Bonjour,
Est-il possible d'afficher du texte HTML ou RTF dans une table en Java (pour un développement client riche) ?
Merci. Cordialement. Gilles
Salut,
Swing supporte l'HTML 4, via les JTextPane/JEditorPane.
Toutefois c'est vraiment basique en comparaison des navigateurs modernes.
Sinon il y a la solution WebView de JavaFX dans Java 8 : http://docs.oracle.com/javafx/2/swin...y.htm#CHDIEEJE
a++
Bonjour,
merci pour votre réponse. Mais je ne crois pas que cela soit ce que je cherche. Dans mes bases de données, certains champs sont des blobs qui contiennent soit du html soit du rtf (encodés d'ailleurs en base 64). Ce sont des textes "peu" enrichis (couleur, fond, éventuellement polices, tailles, puces, le tout sans images). Je peux les afficher (je ne cherche pas à faire autre chose) dans des grilles (ou tables suivant le langage) avec Windev ou avec Qt 5. Je me demandais s'il était possible d'en faire autant avec Java.
Je ne suis pas un grand connaisseur de Java d'une manière générale et encore moins en client riche. Je n'utilise Java qu'avec Androïd Studio (java 7)... et c'est à cette occasion que j'ai découvert "un" Java... très sympathique d'ailleurs. Je voudrais simplement savoir si -en client riche- c'est faisable ou non... et comment ?
Cordialement. Gilles
Tu veux dire quoi exactement par "client riche" ? Car la notion est vague et peut englober plusieurs technos.
Bref quels techno tu utilises exactement ?
En Swing tu peux afficher de l'HTML4. Si tes bouts d'HTML ne sont pas trop compliqué cela pourrait amplement suffire.
Et apparemment il y a un kit RTF, donc cela devrait également être possible : http://docs.oracle.com/javase/7/docs...EditorKit.html
En JavaFX par contre je n'en ai aucune idée.
a++
La réponse est donnée sur StackOverFlow : il faut créer une fabrique a cellule qui intègre un WebView en tant que graphic de la cellule.
Quelque chose dans le genre :
Par contre, il faudra faire des tests pour vérifier si le problème indiqué concernant la taille des cellules se pose ou pas ou si ça a été corrigé depuis.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 TableView<String> tableView = ... tableView.getColumns().forEach(tableColum -> tableColum .setCellFactory(tv -> return new TableCell<String, String>() { private final WebView webView = new WebView(); @Override public void updateItem(String value, boolean empty) { super.updateItem(value, empty); setText(null); Node graphic = null; if (!empty && value != null) { webView.getEngine().loadContent(value); graphic = webView; } setGraphic(graphic); } } }));
Effectivement, par défaut la taille semble un peu space, mais ils semble être possible de la corriger sans trop de difficulté (du moins dans le test) :
Pièce jointe 151578Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 public class Main extends Application { @Override public void start(Stage primaryStage) { final int columnNumber = 3; final int rowNumber = 3; final TableView<String> tableView = new TableView<>(); tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); for (int columnIndex = 0; columnIndex < columnNumber; columnIndex++) { final TableColumn<String, String> tableColumn = new TableColumn<>("Column " + (columnIndex + 1)); tableColumn.setCellValueFactory(cellDataFeature -> { final String value = cellDataFeature.getValue(); return new SimpleStringProperty(value); }); tableColumn.setCellFactory(tv -> new TableCell<String, String>() { private final WebView webView = new WebView(); { setPadding(Insets.EMPTY); webView.setPrefHeight(USE_COMPUTED_SIZE); webView.setPrefWidth(Double.MAX_VALUE); } @Override public void updateItem(String value, boolean empty) { super.updateItem(value, empty); setText(null); Node graphic = null; if (!empty && value != null) { final int columnIndex = getTableView().getColumns().indexOf(getTableColumn()); final int rowIndex = getIndex(); final int red = (int) Math.floor(255d * rowIndex / (double) rowNumber); final int green = (int) Math.floor(255d * columnIndex / (double) columnNumber); final String color = String.format("#%02X%02XFF", red, green); final String cellValue = String.format(value, color); webView.getEngine().loadContent(cellValue); graphic = webView; } setGraphic(graphic); } }); tableView.getColumns().add(tableColumn); } for (int rowIndex = 0; rowIndex < rowNumber; rowIndex++) { String htmlBit = "<html>\n" + "</head>\n" + " <style type=\"text/css\">\n" + " body{\n" + " background-color:%s;" + " margin: 0;\n" + " padding: 0\n" + " }\n" + " </style>\n" + "</head>\n" + "<body>\n" + "Hello World!\n" + "</body>\n" + "</html>"; tableView.getItems().add(htmlBit); } final StackPane root = new StackPane(); root.getChildren().add(tableView); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("Test"); primaryStage.setScene(scene); primaryStage.show(); } /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); } }
Tout n'est pas parfait 100% du temps ceci dit car parfois, au lancement, le WebView s’étale sur deux lignes et fait apparaitre sa barre de scroll. Légèrement redimensionner la fenêtre suffit a faire que l'affichage redevienne correct.
Pour des labels qui s’étalent sur plus d'une ligne il faudra probablement fournir une hauteur par défaut.