IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Afficher des symboles et formules mathématiques dans un JTextPane


Sujet :

AWT/Swing Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Afficher des symboles et formules mathématiques dans un JTextPane
    Bonjour à vous

    Actuellement, je travaille sur une application java qui devrait proposer diverses exercices de mathématiques. Le problème est que dans les exercices de maths il y a beaucoup de caratères spéciaux comme les vecteurs, les intégrales, les symboles mathématiques. L'application devrait afficher les exercices de mathématiques. Maintenant je ne sais pas comment afficher tous ces caractères spéciaux. J'ai utilisé un fichier .txt mais l'affichage des caractères n'était pas correct.
    Je viens donc solliciter votre aide pour pouvoir afficher un exercice de maths dans un jTextArea ou jTextPane ou jEditorPane ou autre chose. Aussi si vous connaissez un format de fichier qui pourrait m'aider à résoudre xa.
    Je croyais utiliser un fichier .docx mais je ne trouve pas encore un code java pour la lecture des .docx dans un jTextArea.
    Merci à vous

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Le problème ce n'est pas trop la lecture du fichier, mais son rendu. Pour un docx, je ne connais pas d'API pour en afficher. On pourrait le faire avec un PDF (il existe différentes API, ou on peut utiliser même un browser web intégré (A base de WebView JavaFX).

    Si les formules sont limitées, on peut utiliser une police qui affiche ces caractères spéciaux (comme une police unicode par exemple), mais si tu as des formules un peu complexe comme :

    Formule mathématique

    ça ne sera pas suffisant (ou tu vas galérer pour un résultat peu satisfaisant visuellement).

    Mais dans un JTextPane on peut combiner du texte et des images, et il existe des bibliothèques java pour générer des images (bmp, svg, etc...) à partir d'une formule LATEX, (ou MATHML, ou autre). Disons que le LATEX est assez pratique pour faire des formules et on trouve facilement des éditeurs interactifs de formules en LATEX en ligne sur le web.
    Pour faire le texte, on utilisera du html, ce qui simplifie le rendu, et permet d'avoir des styles. On peut même afficher le html dans un WebView JavaFX, pour avoir un rendu html/css complet et super soigné.


    Voici un exemple rapide, ci-après, avec du texte en html, à base de JtextPane, JLatexMath, pour faire les formules en LATEX ().

    Pour place une formule, on utilise la balise IMG, et on met la formule latex dans l'attribut src, précédé de latex:.

    Exemple : latex:x^{2} pour x2.

    On peut utiliser des paramètres : on ajoute ? à la fin, et on met les paramètres après, sous forme nom=valeur.

    Les paramètres possibles sont :
    - size : la taille (numérique) (exemple : latex:x^{2}?size=40). Par défaut, c'est 20.
    - color : la couleur (un code RGB hexadécimal, ou un nom de couleur) (exemple : latex:x^{2}?color=FF0000 pour rouge, ou latex:x^{2}?color=red)). Par défaut, c'est black (noir).
    - type : le type de fichier image (une chaine) (exemple : latex:x^{2}?type=jpeg pour du jpeg). Par défaut, c'est png.

    S'il y a plusieurs paramètres, on les sépare avec &. Par exemple : latex:x^{2}?size=40&color=red.

    Il n'y a pas besoin d'encoder les caractères comme une URL classique (il ne faut pas en fait), sauf pour le point d'interrogation, que l'on met sous cette forme :
    \mathord%3F.

    Ne pas oublier d'échapper les \ (les doubler).

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package demolatex;
     
    import java.awt.Container;
    import java.awt.Toolkit;
     
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextPane;
     
    public class Demo {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Demo affichage de formules mathématiques dans un JTextPane");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		String text = "<html><body><p>Un exemple de formule : </p>"
    		+ "<center><img src='latex:\\sum_{i=0}^{n} \\int_{0}^{\\frac{\\pi }{2}} \\frac{1}{1+cos^{i}(x)}'></center>"
    		+ "<p>Norme d'un vecteur de coordonnées (x, y)&nbsp;:</p>" 
    		+ "<img src='latex:\\left \\| \\vec{v} \\right \\| = \\sqrt{ x^{2} + y^{2}}?size=40&color=blue'>"
    		+ "<p>L'ensemble des carrés parfaits non nuls&nbsp;: <img src='latex:\\left \\{ y^{2} | y\\in \\mathbb{N} \\ et\\  y\\geq 1 \\right \\}?type=jpeg'></p>" 
    		+ "</body></html>";
     
    		frame.setContentPane(createContent(text));
     
    		frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static Container createContent(String text) {
    		JTextPane pane = new JTextPane();
    		pane.setContentType("text/html");
    		pane.setText(text);
    		pane.setEditable(false); // pour qu'on ne puisse pas modifier le texte
    		pane.getCaret().setVisible(false); // pour qu'on ne voit pas le curseur
    		return new JScrollPane(pane);
    	}
     
    }

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    package sun.net.www.protocol.latex; // important de conserver ce nom !
     
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.io.BufferedInputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.net.URLConnection;
    import java.net.URLDecoder;
    import java.net.URLStreamHandler;
    import java.util.Collections;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
     
    import javax.imageio.ImageIO;
    import javax.swing.JLabel;
     
    import org.scilab.forge.jlatexmath.TeXConstants;
    import org.scilab.forge.jlatexmath.TeXFormula;
    import org.scilab.forge.jlatexmath.TeXIcon;
     
    public class Handler extends URLStreamHandler { // la classe doit absolument s'appeler Handler
     
    	private final static Map<String, Color> NAMED_COLOR = createAllowedColors(); 
    	private final static String ALLOWED_COLOR_NAMES = toString(NAMED_COLOR);
     
    	@Override
    	protected URLConnection openConnection(URL url) throws IOException {
    		return new LatexConnection(url);
    	} 
     
    	private static class LatexConnection extends URLConnection {
     
    		private static final String SIZE_PARAM = "size";
    		private static final String COLOR_PARAM = "color";
    		private static final String TYPE_PARAM = "type";
     
    		public LatexConnection(URL url) {
    			super(url);
    			if (!"latex".equals(url.getProtocol())) {
    				throw new IllegalArgumentException();
    			}
    		}
     
    		@Override
    		public void connect() throws IOException {
     
    		}
     
    		@Override
    		public String getContentType() {
    			return "image/png";
    		}
     
    		@Override
    		public InputStream getInputStream() throws IOException {
    			try {
    				return createInputStream();
    			}
    			catch(IOException e) {
    				e.printStackTrace();
    				throw e;
    			}
    		}
     
    		private InputStream createInputStream() throws IOException {
    			String latex = decodePath(url.getPath());
     
    			int size = 20;
    			Color color = Color.BLACK;
    			String type = "png";
     
    			String query = url.getQuery();
    			if (query != null) {
     
    				String[] params = query.split("&");
    				Set<String> setParams = new HashSet<>();
    				for (String param : params) {
    					String[] paramPart = param.split("=");
    					if ( paramPart.length!=2 ) {
    						throw new IOException(String.format("Unknown parameter or no value: %s.",param));
    					}
    					String name = paramPart[0].trim().toLowerCase();
    					if ( setParams.contains(name) ) {
    						throw new IOException(String.format("Duplicate parameter %s.", name));
    					}
    					String value = decode(paramPart[1]);
    					switch (name) {
    					case SIZE_PARAM:
    						try {
    							size = Integer.parseInt(value);
    							if ( size<1 ) {
    								throw new IOException(String.format("Size parameter must be greater than 0: %s.",value));
    							}
    						} catch (NumberFormatException e) {
    							throw new IOException(String.format("Size parameter must be an integer value: %s.",value), e);
    						}
    						break;
    					case TYPE_PARAM:
    						if ( ImageIO.getImageWritersByFormatName(value).hasNext() ) {
    							type = value;
    						}
    						else {
    							throw new IOException(String.format("Unknown image format: %s.",value));
    						}
    						break;
    					case COLOR_PARAM:
    						String colorName = value.toLowerCase();
    						if ( NAMED_COLOR.containsKey(colorName) ) {
    							color = NAMED_COLOR.get(colorName);
    						}
    						else {
    							try {
    								int colorcode = Integer.parseInt(value, 16);
    								color = new Color(colorcode);
    							} catch (NumberFormatException e) {
    								throw new IOException(String.format("Color must be a hexadecimal value or a name (%s) : %s.",value, ALLOWED_COLOR_NAMES), e);
    							}
    						}
    						break;
    					default:
    						throw new IOException(String.format("Unknown parameter: %s."));
    					}
    					setParams.add(name);
    				}
     
    			}
     
    			TeXFormula formula = new TeXFormula(latex);
     
    			TeXIcon icon = formula.new TeXIconBuilder()
    					.setStyle(TeXConstants.STYLE_DISPLAY).setSize(size).build();
     
    			BufferedImage image = new BufferedImage(icon.getIconWidth(),
    					icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
     
    			Graphics2D g = image.createGraphics();
     
    			g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    					RenderingHints.VALUE_ANTIALIAS_ON);
    			g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
    					RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
     
    			JLabel jl = new JLabel();
    			jl.setForeground(color);
    			icon.paintIcon(jl, g, 0, 0);
     
    			g.dispose();
     
    			try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
    				ImageIO.write(image, type, outputStream);
    				return new BufferedInputStream(new ByteArrayInputStream(
    						outputStream.toByteArray()));
    			}
     
    		}
     
    	}
     
    	private static String decodePath(String value) /*throws IOException*/ {
    		return value.replaceAll("%3F", "?");
    	}
     
    	private static String decode(String value) throws IOException {
    		return URLDecoder.decode(value, "UTF8").trim();
    	}
     
    	private static Map<String, Color> createAllowedColors() {
    		Map<String, Color> namedColors = new TreeMap<String, Color>();
    		for(java.lang.reflect.Field field : Color.class.getFields()) {
    			if ( Color.class.equals(field.getType()) && java.lang.reflect.Modifier.isStatic(field.getModifiers()) ) {
    				try {
    					namedColors.put( field.getName().toLowerCase().replaceAll("_", ""), (Color)field.get(null));
    				} catch (IllegalArgumentException | IllegalAccessException e) {
    					// ignore
    				}
    			}
    		}
    		return Collections.unmodifiableMap(namedColors);
    	}
     
    	private static String toString(Map<String, Color> namedColor) {
    		return namedColor.keySet().stream()
                    .map(Object::toString)
                    .collect(java.util.stream.Collectors.joining(", "));
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    La version avec WebView (j'ai utilisé URLEncoder et URLDecoder pour encoder l'URL, alors que c'est plutôt pour les valeurs de paramètres, pour faire simple. En tout cas, plus besoin d'encoder le ? à la main comme dans le cas précédent).

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package demolatexfx;
     
    import java.awt.Container;
    import java.awt.Toolkit;
    import java.io.UnsupportedEncodingException;
    import java.net.URL;
    import java.net.URLStreamHandler;
    import java.net.URLStreamHandlerFactory;
     
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
     
    public class DemoFX {
     
    	public static void main(String[] args) throws UnsupportedEncodingException {
     
     
     
    		URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory() {
     
    			@Override
    			public URLStreamHandler createURLStreamHandler(String protocol) {
    				if ( "latex".equals(protocol) ) {
    					return new LatexURLHandler();
    				}
    				return null;
    			}
    		});
     
    		JFrame frame = new JFrame("Demo affichage de formules mathématiques dans un WebView JavaFX");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		final String formule1 = LatexURLHandler.encodeLatex("\\sum_{i=0}^{n} \\int_{0}^{\\frac{\\pi }{2}} \\frac{1}{1+cos^{i}(x)}");
    		final String formule2 = LatexURLHandler.encodeLatex("\\left \\| \\vec{v} \\right \\| = \\sqrt{ x^{2} + y^{2}}");
    		final String formule3 = LatexURLHandler.encodeLatex("\\left \\{ y^{2} | y\\in \\mathbb{N} \\ et\\  y\\geq 1 \\right \\}");
     
    		final String text = "<html><body><p>Un exemple de formule : </p>"
    				+ "<center><img src='latex:"+formule1+"'></center>"
    				+ "<p>Norme d'un vecteur de coordonnées (x, y)&nbsp;:</p>" 
    				+ "<img src='latex:"+formule2+"?size=40&color=blue'>"
    				+ "<p>L'ensemble des carrés parfaits non nuls&nbsp;: <img src='latex:"+formule3+"?type=png'></p>" 
    				+ "</body></html>";
     
    		frame.setContentPane(createContent(text));
     
    		frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static Container createContent(String text) {
    		SimpleSwingBrowserPanel pane = new SimpleSwingBrowserPanel();
    		pane.setHTMLContent(text);
    		return new JScrollPane(pane);
    	}
     
    }

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    package demolatexfx;
     
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.io.BufferedInputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    import java.net.URLStreamHandler;
    import java.util.Collections;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
     
    import javax.imageio.ImageIO;
    import javax.swing.JLabel;
     
    import org.scilab.forge.jlatexmath.TeXConstants;
    import org.scilab.forge.jlatexmath.TeXFormula;
    import org.scilab.forge.jlatexmath.TeXIcon;
     
    public class LatexURLHandler extends URLStreamHandler {
     
    	private final static Map<String, Color> NAMED_COLOR = createAllowedColors(); 
    	private final static String ALLOWED_COLOR_NAMES = toString(NAMED_COLOR);
     
    	@Override
    	protected URLConnection openConnection(URL url) throws IOException {
    		return new LatexConnection(url);
    	} 
     
    	private static class LatexConnection extends URLConnection {
     
    		private static final String SIZE_PARAM = "size";
    		private static final String COLOR_PARAM = "color";
    		private static final String TYPE_PARAM = "type";
     
    		public LatexConnection(URL url) {
    			super(url);
    			if (!"latex".equals(url.getProtocol())) {
    				throw new IllegalArgumentException();
    			}
    		}
     
    		@Override
    		public void connect() throws IOException {
     
    		}
     
    		@Override
    		public String getContentType() {
    			return "image/png";
    		}
     
    		@Override
    		public InputStream getInputStream() throws IOException {
    			try {
    				return createInputStream();
    			}
    			catch(IOException e) {
    				e.printStackTrace();
    				throw e;
    			}
    		}
     
    		private InputStream createInputStream() throws IOException {
    			String latex = decodePath(url.getPath());
     
    			int size = 20;
    			Color color = Color.BLACK;
    			String type = "png";
     
    			String query = url.getQuery();
    			if (query != null) {
     
    				String[] params = query.split("&");
    				Set<String> setParams = new HashSet<>();
    				for (String param : params) {
    					String[] paramPart = param.split("=");
    					if ( paramPart.length!=2 ) {
    						throw new IOException(String.format("Unknown parameter or no value: %s.",param));
    					}
    					String name = paramPart[0].trim().toLowerCase();
    					if ( setParams.contains(name) ) {
    						throw new IOException(String.format("Duplicate parameter %s.", name));
    					}
    					String value = decode(paramPart[1]);
    					switch (name) {
    					case SIZE_PARAM:
    						try {
    							size = Integer.parseInt(value);
    							if ( size<1 ) {
    								throw new IOException(String.format("Size parameter must be greater than 0: %s.",value));
    							}
    						} catch (NumberFormatException e) {
    							throw new IOException(String.format("Size parameter must be an integer value: %s.",value), e);
    						}
    						break;
    					case TYPE_PARAM:
    						if ( ImageIO.getImageWritersByFormatName(value).hasNext() ) {
    							type = value;
    						}
    						else {
    							throw new IOException(String.format("Unknown image format: %s.",value));
    						}
    						break;
    					case COLOR_PARAM:
    						String colorName = value.toLowerCase();
    						if ( NAMED_COLOR.containsKey(colorName) ) {
    							color = NAMED_COLOR.get(colorName);
    						}
    						else {
    							try {
    								int colorcode = Integer.parseInt(value, 16);
    								color = new Color(colorcode);
    							} catch (NumberFormatException e) {
    								throw new IOException(String.format("Color must be a hexadecimal value or a name (%s) : %s.",value, ALLOWED_COLOR_NAMES), e);
    							}
    						}
    						break;
    					default:
    						throw new IOException(String.format("Unknown parameter: %s."));
    					}
    					setParams.add(name);
    				}
     
    			}
     
    			TeXFormula formula = new TeXFormula(latex);
     
    			TeXIcon icon = formula.new TeXIconBuilder()
    					.setStyle(TeXConstants.STYLE_DISPLAY).setSize(size).build();
     
    			BufferedImage image = new BufferedImage(icon.getIconWidth(),
    					icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
     
    			Graphics2D g = image.createGraphics();
     
    			g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    					RenderingHints.VALUE_ANTIALIAS_ON);
    			g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
    					RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
     
    			JLabel jl = new JLabel();
    			jl.setForeground(color);
    			icon.paintIcon(jl, g, 0, 0);
     
    			g.dispose();
     
    			try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
    				ImageIO.write(image, type, outputStream);
    				return new BufferedInputStream(new ByteArrayInputStream(
    						outputStream.toByteArray()));
    			}
     
    		}
     
    	}
     
    	private static String decodePath(String value) throws UnsupportedEncodingException {
    		return URLDecoder.decode(value, "UTF-8");
    	}
     
    	private static String decode(String value) throws IOException {
    		return URLDecoder.decode(value, "UTF8").trim();
    	}
     
    	private static Map<String, Color> createAllowedColors() {
    		Map<String, Color> namedColors = new TreeMap<String, Color>();
    		for(java.lang.reflect.Field field : Color.class.getFields()) {
    			if ( Color.class.equals(field.getType()) && java.lang.reflect.Modifier.isStatic(field.getModifiers()) ) {
    				try {
    					namedColors.put( field.getName().toLowerCase().replaceAll("_", ""), (Color)field.get(null));
    				} catch (IllegalArgumentException | IllegalAccessException e) {
    					// ignore
    				}
    			}
    		}
    		return Collections.unmodifiableMap(namedColors);
    	}
     
    	private static String toString(Map<String, Color> namedColor) {
    		return namedColor.keySet().stream()
                    .map(Object::toString)
                    .collect(java.util.stream.Collectors.joining(", "));
    	}
     
    	public static String encodeLatex(String url) throws UnsupportedEncodingException {
    		return URLEncoder.encode(url, "UTF-8");
    	}
     
    }

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package demolatexfx;
     
    import java.awt.BorderLayout;
     
    import javafx.application.Platform;
    import javafx.embed.swing.JFXPanel;
    import javafx.scene.Scene;
    import javafx.scene.web.WebEngine;
    import javafx.scene.web.WebView;
     
    import javax.swing.JPanel;
     
    public class SimpleSwingBrowserPanel extends JPanel {
     
        /**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	private final JFXPanel jfxPanel = new JFXPanel();
        private WebEngine engine;
     
        public SimpleSwingBrowserPanel() {
            super();
            initComponents();
        }
     
     
        private void initComponents() {
            createScene();
     
            setLayout(new BorderLayout());
     
            add(jfxPanel, BorderLayout.CENTER);
     
     
        }
     
        private void createScene() {
     
            Platform.runLater(new Runnable() {
                @Override 
                public void run() {
     
                    WebView view = new WebView();
                    engine = view.getEngine();
                    jfxPanel.setScene(new Scene(view));
     
                }
     
            });
     
        }
     
        public void setHTMLContent(final String content) {
            Platform.runLater(new Runnable() {
                @Override 
                public void run() {
                    engine.loadContent(content);
                }
            });
        }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Signalisation d'erreur au niveau des codes
    Bonjour
    Merci pour votre aide par rapport à ma préoccupation sur l’affichage des caractères spéciaux et symboles mathématique en java.
    J’ai lu votre réponse, j’ai essayé le premier code java. Ça m’a affiché les phrases dans le jTextPane mais les trois formules ne se sont pas affichées. J’ai juste eu les trois phrases.

    Quant au second code, il y a une erreur qui est signalé au niveau de cette méthode ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private static String toString(Map<String, Color> namedColor) {
            return namedColor.keySet().stream()
                    .map(Object::toString)
                    .collect(java.util.stream.Collectors.joining(", "));
        }
    Voici l’erreur que ça me met en soulignant les trois lignes de la méthode en rouge : « method reference not expected here method references are not supported in -source 1.7 (use -source 8 or higher to enable method references) »
    Que pourrais-je faire pour régler ce problème ?

    Par rapport à la démo du latex FX, je ne sais pas s'il faut que je crée une classe JavaFX avance d'insérer ces codes ou si je crée une classe simple Java.
    Merci à vous.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut

    Citation Envoyé par Djenh Voir le message
    j’ai essayé le premier code java. Ça m’a affiché les phrases dans le jTextPane mais les trois formules ne se sont pas affichées. J’ai juste eu les trois phrases.
    As-tu bien mis dans ton classpath, le jar de jlatexmath ? (dans le buildpath dans ton projet si tu utilises un IDE). Par contre, je viens de remarquer que le // du commentaire (// important de conserver ce nom !) dans la classe Handler avait sauté lors de mon copier-coller, probablement à cause de la transformation automatique en URL) : si tu ne les as pas ajouté toi-même (les deux slashes manquants), peut-être le problème vient-il du fait que la classe ne compile même pas. (EDIT : je viens de remettre les // manquants directement dans l'extrait de code dans le message)

    Voici le rendu que tu dois obtenir :

    Nom : Capture.PNG
Affichages : 4066
Taille : 18,4 Ko

    Citation Envoyé par Djenh Voir le message
    Quant au second code, il y a une erreur qui est signalé au niveau de cette méthode ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private static String toString(Map<String, Color> namedColor) {
            return namedColor.keySet().stream()
                    .map(Object::toString)
                    .collect(java.util.stream.Collectors.joining(", "));
        }
    Voici l’erreur que ça me met en soulignant les trois lignes de la méthode en rouge : « method reference not expected here method references are not supported in -source 1.7 (use -source 8 or higher to enable method references) »
    Il faut faire exactement ce que dit le message, c'est-à-dire configurer ton projet pour qu'il valide les sources version 1.8 (si tu as installé cette version, ce que je ne saurais trop te conseiller), parce que ce code ne fonctionne que en Java 8.
    Voici l'équivalent pour les versions précédentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private static String toString(Map<String, Color> namedColor) {
    		StringBuilder sb = new StringBuilder();
    		boolean first=true;
    		for(String name : namedColor.keySet()) {
    			if ( first ) first=false;
    			else sb.append(", ");
    			sb.append(name);
    		}
    		return sb.toString();
        }
    Citation Envoyé par Djenh Voir le message
    Par rapport à la démo du latex FX, je ne sais pas s'il faut que je crée une classe JavaFX avance d'insérer ces codes ou si je crée une classe simple Java.
    Non. Il suffit d'utiliser telles quelles les classes que je t'ai données : simplement sous Eclipse (Luna), JavaFX ne pourra pas être directement utilisé. Il faut installer 2 plugins pour pouvoir l'utiliser (voir e(fx)clipse). C'est bien un exemple de code SWING, qui utilise un composant JavaFX intégré.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Pour le premier code qui affichera les symboles, voici les .jar de jlatexmath que j'ai inséré dans la librairie de mon projet :
    jlatexmath-1.0.3.jar ;
    jlatextmath-embedded-fop-1.0.3.jar
    et jlatexmath-fop-1.0.3.jar.
    J'ai mis ces trois .jar dans la librairie de mon projet. Mais xa ne marche pas toujours, s'il vous plait pourriez vous m'indiquer comment les mettre dans le path?
    Il n'y a plus d'erreur pour le second code avec la méthode que vous venez de me donner, mais il n'y a pas une classe main dans cette classe là et la classe ne s'exécute pas. Donc je ne sais pas s'il faut que je crée une une petite méthode main dans cette classe là. Par rapport aux trois classes pour le javaFX, j'ai une erreur au niveau des import de javafx, je ne sais pas où télécharger ces .jar pour régler les problèmes avec ces imports:
    import javafx.application.Platform;
    import javafx.embed.swing.JFXPanel;
    import javafx.scene.Scene;
    import javafx.scene.web.WebEngine;
    import javafx.scene.web.WebView;

    Merci à vous, c'est gentil de votre part.

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Seul jlatexmath-1.0.3.jar est nécessaire.

    Ensuite, pour le mettre dans le build path, sous Eclipse : après l'avoir mis dans ton projet, dans un sous-dossier lib par exemple, sélectionne-le, affiche le menu contextuel, puis le menu Build Path, puis le menu Add to Build Path.

    La classe main pour le code pure SWING est Demo (la première dans le message), et DemoFX dans le code à base de WebView JavaFX (la première également dans le message). Ce sont justes des exemples de principe. Dans ton code final, il faudra charger probablement le html depuis des fichiers (beaucoup plus pratique que de ce farcir de la concaténation de String dans des méthodes de 3000 lignes ou plus).

    Attention, pour la classe Handler du code pure SWING, il est indispensable de mettre cette classe dans le package indiqué, et de ne pas changer son nom (cela utilise un mécanisme interne de Java qui détecte la classe automatiquement). On pourrait changer ce mécanisme en utilisant à la place celui que j'ai utilisé dans l'autre exemple (enregistrer un URLStreamHandlerFactory).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Djenh Voir le message
    Par rapport aux trois classes pour le javaFX, j'ai une erreur au niveau des import de javafx, je ne sais pas où télécharger ces .jar pour régler les problèmes avec ces imports:
    import javafx.application.Platform;
    import javafx.embed.swing.JFXPanel;
    import javafx.scene.Scene;
    import javafx.scene.web.WebEngine;
    import javafx.scene.web.WebView;
    Tu utilises quoi comme IDE ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    J'utilise NetBeans 8.0 comme IDE.

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Djenh Voir le message
    J'utilise NetBeans 8.0 comme IDE.
    Ah, là, malheureusement je ne peux te répondre. Je n'utilise jamais NetBeans (à part pour profiler). Il me semble avoir lu quelque part que JavaFX était pris en compte directement dans NetBeans, sans manipulations particulières. Mais cela dépend peut-être des versions. Il doit bien y avoir quelque chose à ce sujet dans la documentation de NetBeans.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Ajouter des formules mathématiques dans vos messages
    Par fafabzh6 dans le forum SAS STAT
    Réponses: 1
    Dernier message: 14/09/2014, 12h03
  2. Ajouter des formules mathématiques dans vos messages
    Par fafabzh6 dans le forum Algorithme & Mathématiques
    Réponses: 0
    Dernier message: 01/08/2014, 11h35
  3. Stocker des formules mathématiques dans une table
    Par charad dans le forum Outils
    Réponses: 1
    Dernier message: 25/09/2009, 19h31
  4. Afficher des symboles musicaux
    Par atha2 dans le forum Interfaces Graphiques en Java
    Réponses: 14
    Dernier message: 15/08/2007, 01h07
  5. Réponses: 4
    Dernier message: 30/05/2007, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo