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

Composants Java Discussion :

[JTextPane] Perdue dans la syntaxe et le html


Sujet :

Composants Java

  1. #1
    Membre régulier Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 71
    Points
    71
    Par défaut [JTextPane] Perdue dans la syntaxe et le html
    Bonjour,
    Je bosse en ce moment sur un File Printer en java : j'ai des parties fixes et donc j'utilise du code HTML pour la mise en forme => donc oui JTextPane est mon ami !
    Je sais qu'il y a déjà plusieurs discussions sur le forum à ce propos et je les ai parcouru.
    Cependant, j'ai cherché dans la doc (et vos messages) comment ouvrir et interpréter du code html dans mon petit programme java : mais là je suis perdue !

    A quoi sert les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HTMLEditorKit k = new HTMLEditorKit();    	
    HTMLDocument doc = (HTMLDocument)k.createDefaultDocument();
    pourquoi et quand dois-je utiliser ce bout de code concernant le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Style defaut = texte.getStyle("default");
    		Style as = texte.addStyle("stylePerso",defaut);
     
    		//SimpleAttributeSet as = new SimpleAttributeSet();
    		StyleConstants.setFontFamily(as, "Monospaced");
    		StyleConstants.setFontSize(as, 20);
    		StyleConstants.setAlignment(as, 1);
     
    		StyledDocument doc = texte.getStyledDocument();
    De plus, comme je l'ai lu dans vos messages : le style est spécifié dans les balise html alors pourquoi utiliser ces methodes dans le JTExtPane ?

    Enfin : comment ajouter la page que j'ai génére dans le JTextPane : parce que partout ce que je lis (peut etre que je lis mal voir sans aucun doute):
    ils ajoutent le HTML dans le StyledDocument doc grâce à la méthode insertString.

    Je vous envois les parties cruciales de mon code:
    Code : 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
     
    public class FileAfficher extends JFrame {
    	private JTextPane texte;
    	private boolean texteModifie = false;
    	private String reponse;
     
    	public static void main(String[] args) {
    		JFrame.setDefaultLookAndFeelDecorated(true);
    		JDialog.setDefaultLookAndFeelDecorated(true);
    		new FileAfficher();
    	}  
     
    	FileAfficher() {
    		super("File Printer");
    		setSize(new Dimension(800, 800));
    		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    		addWindowListener(new WindowAdapter() {
    			public void windowClosing(WindowEvent evt) {
    				quitter();
    			}
    		});
     
    		texte = new JTextPane();
     
    		texte.setContentType("text/html" );
    		HTMLEditorKit k = new HTMLEditorKit();    	
    		HTMLDocument doc = (HTMLDocument)k.createDefaultDocument();
    		texte.setEditorKit(k);
    		texte.setDocument(doc);
     
    		//texte.setFont(new Font("Monospaced", Font.PLAIN, 12));	
    		texte.setBackground(Color.WHITE);
    		texte.addKeyListener(new KeyAdapter() {
    			public void keyTyped(KeyEvent evt) {
    				texteModifie = true;
    			}
    		});
     
    		getContentPane().add(new JScrollPane(texte));
    		setJMenuBar(barreMenus());
    		setVisible(true);
    	}
     
    	private JMenuBar barreMenus() {
    [...]
                    menu.addSeparator();
    		JMenuItem information = new JMenuItem("Information");
    		menu.add(information);
    		information.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				reponse = JOptionPane.showInputDialog("Nom du centre hospitalier?");
    				try {
    					FicheRecapi(reponse);
    					texteModifie =true;
    				} catch (IOException e1) {
    					// TODO Auto-generated catch block
    					e1.printStackTrace();
    				}
     
    			}
    		});
     
    		return barre;
    }
    private void FicheRecapi(String reponse) throws IOException{
     
    		String[] initString =
    		{ /* ...  fill array with initial text  ...*/ };
     
    		Style defaut = texte.getStyle("default");
    		Style as = texte.addStyle("stylePerso",defaut);
     
    		//SimpleAttributeSet as = new SimpleAttributeSet();
    		StyleConstants.setFontFamily(as, "Monospaced");
    		StyleConstants.setFontSize(as, 20);
    		StyleConstants.setAlignment(as, 1);
     
    		StyledDocument doc = texte.getStyledDocument();
     
    		//Load the text pane with styled text.
    		try {
     
    			//insertion de l'entête de la Fiche Récapitulative qui reste inchangée
    			//texte.insertIcon(new ImageIcon("logo_biotech.jpg"));
     
    			String file ="/home/fripette/Desktop/FilePrinter/enteteFicheRecap.html";
    			FileReader enteteFicheRecap= new FileReader(file);
     
    			doc.insertString(doc.getLength(),String.valueOf(enteteFicheRecap),as);
     
     
    			/**concernant la partie variable de cette Fiche
                            for (int i=0; i < initString.length; i++) {
                                    doc.insertString(doc.getLength(), initString[i],as);    
                            }**/
     
     
    			//insertion de la fin de la Fiche Récapitulative qui reste inchangée
    			String filename ="/home/fripette/Desktop/FilePrinter/finFicheRecap.html";
    			FileReader finFichRecap= new FileReader(filename);
    			doc.insertString(doc.getLength(),String.valueOf(finFichRecap),as);
    					//doc.getStyle(as));
     
    		}
    		catch (BadLocationException ble) {
    			System.err.println("Couldn't insert initial text into text pane.");
    		}
    	} 
     
    }
    S'il vous plait, comme vous pouvez le voir je suis perdue !
    Pouvez vous me donner un site bien sur le JTextPane ou m'expliquer concrétement quand utilisez quoi !
    MERCI

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par fripette Voir le message
    A quoi sert les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HTMLEditorKit k = new HTMLEditorKit();    	
    HTMLDocument doc = (HTMLDocument)k.createDefaultDocument();
    Çà sert à créer un objet de type Document, correspondant à ton html, sans devoir passer par un composant graphique.
    pourquoi et quand dois-je utiliser ce bout de code concernant le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Style defaut = texte.getStyle("default");
    		Style as = texte.addStyle("stylePerso",defaut);
     
    		//SimpleAttributeSet as = new SimpleAttributeSet();
    		StyleConstants.setFontFamily(as, "Monospaced");
    		StyleConstants.setFontSize(as, 20);
    		StyleConstants.setAlignment(as, 1);
     
    		StyledDocument doc = texte.getStyledDocument();
    De plus, comme je l'ai lu dans vos messages : le style est spécifié dans les balise html alors pourquoi utiliser ces methodes dans le JTExtPane ?
    A vue de nez, çà sert à rajouter des styles non déclaré dans le html je dirais

    Enfin : comment ajouter la page que j'ai génére dans le JTextPane
    Ceci suffit pour afficher du html dans un textPane. Tout le reste c'est pour customizer l'affichage si il ne te conviens pas. Note: textPane gère une liste "simplifié" d'attribut et code html, t'attends pas à avoir un webbrowser complet dans ton textpane!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    textPane.setContentType("text/html");
    textPane.setText(codeHtml);

  3. #3
    Membre régulier Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 71
    Points
    71
    Par défaut
    Bon OK, j'ai intégré. Merci beaucoup pour ta réponse.
    Mais voilà mon soucis : le remplissage de mon JTextPane ne se fait pas dans la même dans le main (endroit de la définition/l'initialisation de mon JTextPane)
    En effet, en fonction des selections de l'utilisateur dans la barre de Menu: la page hmtl appropriée va se charger dans le JTextPane. (donc page blanche au début puis en fonction de l'item sélectionné chargement de la page).

    Voilà où j'en suis :
    Code : 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
     
     
    public class FileAfficher extends JFrame {
    	private JTextPane texte;
    	private boolean texteModifie = false;
    	private String reponse;	private HTMLDocument doc;
     
    	public static void main(String[] args) {
    		JFrame.setDefaultLookAndFeelDecorated(true);
    		JDialog.setDefaultLookAndFeelDecorated(true);
    		new FileAfficher();
    	}  
     
    	FileAfficher() {
    		super("File Printer");
    		setSize(new Dimension(800, 800));
    		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    		addWindowListener(new WindowAdapter() {
     
    		texte = new JTextPane();
    		texte.setContentType("text/html" );
    		HTMLEditorKit k = new HTMLEditorKit();
     
    		//L'unité de base de la structure est un Element, qui a un ensemble d'attributs. 
    		//Les éléments st de natures différentes suivant qu'on a affaire un texte HTML : html, body, p, content, etc...
    		doc = (HTMLDocument)k.createDefaultDocument();
    		texte.setEditorKit(k);
    		texte.setDocument(doc);
     
     
    		Style defaut = texte.getStyle("default");
    		Style as = texte.addStyle("stylePerso",defaut);
     
    		StyleConstants.setFontFamily(as, "Monospaced");
    		StyleConstants.setFontSize(as, 20);
    		StyleConstants.setAlignment(as, 1);
     
    		StyledDocument docStyled = texte.getStyledDocument();
     
     
    		texte.setBackground(Color.WHITE);
     
    		texte.addKeyListener(new KeyAdapter() {
    			public void keyTyped(KeyEvent evt) {
    				texteModifie = true;
    			}
    		});
     
    		getContentPane().add(new JScrollPane(texte));
    		setJMenuBar(barreMenus());
    		setVisible(true);
    	}
     
    	private JMenuBar barreMenus() {
    [.....]
                    menu.addSeparator();
    		JMenuItem information = new JMenuItem("Information");
    		menu.add(information);
    		information.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				String reponse = JOptionPane.showInputDialog("Nom du centre hospitalier?");
     
    				/*
    				 * String nomCentre= JOptionPane.showInputDialog("Nom du centre hospitalier: ");
    				 * String idCentre= JOptionPane.showInputDialog("Identifiant du centre hospitalier: ");
    				 * String nomPreleveur= JOptionPane.showInputDialog("Préleveur: ");
    				 * String datePrelev=JOptionPane.showInputDialog("Date de prélèvement:");
    				 * String heureArrivee=JOptionPane.showInputDialog("Heure d'arrivée:");
    				 * String heureDepart=JOptionPane.showInputDialog("Heure de départ:");
    				 * int numeroPage= JOptionPane.showInputDialog("Numero de fiche:");
    				 */
     
    				try {
    					FicheRecapi(reponse);
    					/*
    					 * Fiche(nomCentr,nomPreleveur,datePrelev,heureArrivee,heureDepart);
    					 */
    					texteModifie =true;
    				} catch (IOException e1) {
    					// TODO Auto-generated catch block
    					e1.printStackTrace();
    				}
     
    			}
    		});
     
    		return barre;
    	}
     
    private void FicheRecapi(String reponse) throws IOException{
     
    		String filename ="/home/fripette/workspace/FilePrinter/finFicheRecap.html";
    		texte.setText(filename);
    Donc lorsque je clique sur l'item "information" que je rentre une réponse bidon (pour le moment après cette information me sera utile ) .
    La page finFicheRecap.html devrait se charger mais il n'y a rien et pas de message d'erreur dans la console !!
    J'ai donné le lien absolu et le script java se trouve aussi dans FilePrinter.
    Des idées ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    heu, si la méthode s'appelle "setText()" et pas "setUrl()" ou "setFile()", c'est qu'il y a une bonne raison Le JTextPane n'ouvre rien, il se content d'afficher le texte que tu lui passe. En l'occurence, il n'affiche rien puisque, en html, il s'attends à avoir un texte qui commence par "<HTML>" et non pas par "/home"


    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte.setText("<HTML><BODY><H1>Hello</H1>ligne1<BR>ligne2</BODY></HTML>");

  5. #5
    Membre régulier Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 71
    Points
    71
    Par défaut
    Oui mais j'ai fait une page en .html (qui elle est contient bien un <html> </html> et tout le tintouin) parce que ce que je veux charger est lourd et que je vais pas TOUT passer à mon setText ligne par ligne!

    Donc dans ma tête :
    peut etre que c'est pas ca et donc hésite pas à me détromper :
    le JtextPane : ouvre le .html et comme je lui ai dit "texte.setContentType("text/html" );"
    il comprend et interpréte les balises de mon .html .

  6. #6
    Membre régulier Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 71
    Points
    71
    Par défaut
    Bon alors j'ai trouvé une éventuelle réponse :
    il "suffit" de faire juste un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    doc = (HTMLDocument)k.createDefaultDocument();
    [...]
    FileInputStream finfilename =new FileInputStream("/home/fripette/workspace/FilePrinter/finFicheRecap.html");
    texte.read(finfilename,doc);
    La page html à ajouter doit être un FileInputStream et la méthode à utiliser est read(FileInpitStream, HTMLDocument).

    Cependant, mon fichier finale se présente ainsi:
    entête.hml (partie non variable)
    partie variable avec information du client
    finale.html(partie non variable).

    Avec la méthode read ne concéde pas l'option append=true .
    Donc ce que je me suis dit : ajout au fur et à mesure de mon script les différentes parties dans un .hmtl final qui lui seul sera affiché!

    J'ai trouvé ce code sur votre forum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FileInputStream debutfilename =new FileInputStream("/home/fripette/workspace/FilePrinter/enteteFicheRecap.html");
    		FileOutputStream fichierFinal = new FileOutputStream("/home/fripette/workspace/FilePrinter/FinalFicheRecap.html");
     
    		/* Lecture par segment de 0.5Mo */
    		byte buffer[]=new byte[512*1024];
    		int nbLecture;
     
    		while( (nbLecture = fichierFinal.read(buffer)) != -1 ) {
    			fichierFinal.write(buffer, 0, nbLecture);
    		}
    fichierFinal.close();
    Cependant , j'ai un problème avec mon Eclipse qui me dit à propos du read:
    "the method read(byte[]) is undefined for the typ FileOutputStream"

    euh ??

  7. #7
    Membre régulier Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 241
    Points : 71
    Points
    71
    Par défaut
    MINCE : j'ai vu mon erreur : je me suis trompée dans les noms des fichiers input et output dans le while !!
    Désolée !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] SELECT avec une boucle for : perdu dans la syntaxe
    Par cyberfred1073 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/04/2014, 22h28
  2. Syntaxe perdue dans VS
    Par Sehnsucht dans le forum F#
    Réponses: 1
    Dernier message: 02/07/2012, 14h35
  3. Perdu dans tous ces framework, mvc, et template
    Par __fabrice dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 02/09/2005, 12h00
  4. Perdu dans le traitement de string
    Par MatMeuh dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/09/2004, 11h34
  5. Perdue dans les Response.Write...
    Par Tapioca dans le forum ASP
    Réponses: 4
    Dernier message: 11/07/2004, 11h54

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