Perdue dans la syntaxe JTextPane et html

Fridimette Messages postés 12 Date d'inscription mercredi 19 mars 2008 Statut Membre Dernière intervention 21 avril 2008 - 20 mars 2008 à 16:51
Fridimette Messages postés 12 Date d'inscription mercredi 19 mars 2008 Statut Membre Dernière intervention 21 avril 2008 - 27 mars 2008 à 10:16
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 !
Cependant, j'ai cherché comment ouvrir une page en  .html dans mon petit programme java et l'afficher sans les balises (cad comme dans un web browser): mais là je
suis perdue !

Je vous envois les parties cruciales de mon code:

--> début code :
publicclass FileAfficher extends JFrame {
private JTextPane texte;
privateboolean texteModifie = false;
private String reponse;

publicstaticvoid 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(){
publicvoid 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(){
publicvoid 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(){
publicvoid 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;
}
privatevoid 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.");
}
}
 
}
 

--> Fin du code.


A quoi servent les lignes suivantes :
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();

en effet j'ai précisé au début :
HTMLEditorKit k = new HTMLEditorKit();
HTMLDocument doc = (HTMLDocument)k.createDefaultDocument();

 et je pensais que c'était suffisant mais je retrouve à chaque fois le StyledDocument !

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.

mais chez moi ca marche pas!

En gros, au vu de mon code, quel est l'étape juste apres pour afficher la page html dans le JtextPane si la méthode insertString n'est pas la bonne.

Merci beaucoup pour votre aide parce que je suis vraiment perdue !

2 réponses

Fridimette Messages postés 12 Date d'inscription mercredi 19 mars 2008 Statut Membre Dernière intervention 21 avril 2008
21 mars 2008 à 12:38
Bon petite évolution :
mon nouveau 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).

publicclass FileAfficher extends JFrame {
private JTextPane texte;
privateboolean texteModifie = false;
private String reponse; private HTMLDocument doc;

publicstaticvoid 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(){
publicvoid 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(){
publicvoid 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;
}
 
privatevoid 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 ?
0
Fridimette Messages postés 12 Date d'inscription mercredi 19 mars 2008 Statut Membre Dernière intervention 21 avril 2008
27 mars 2008 à 10:16
Bon je vous tiens au courant de mon avancé et des problèmes rencontrés.
Peut-être que quelqu'un se trouvera dans mon cas un jour et qu'un autre quelqu'un pourra peut etre m'aider à avancer (maintenant que mon projet est de plus en plus clair).


Je génère des bouts de texte en html que j'ajoute à un fichier html final qui sera affiché dans le JEditorPane :

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 JEditorPane();
texte.setContentType("text/html");
texte.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);

StyleSheet myStyleSheet = new StyleSheet();
myStyleSheet.addRule("body {font: 20px Dialog; color: blue}");
myStyleSheet.addRule("p {font: 20px Serif}");

HTMLEditorKit k = (HTMLEditorKit)(texte.getEditorKitForContentType("text/html"));
k.setStyleSheet(myStyleSheet);
texte.setEditorKit(k);

Document doc = texte.getDocument();
texte.setDocument(doc);
texte.setBackground(Color.WHITE);

getContentPane().add(new JScrollPane(texte));
setJMenuBar(barreMenus());
setVisible(true);
 
private void FicheRecapi(String nomCentre,String idCentre,String nomPreleveur,String datePrelev,String heureArrivee,
String heureDepart,String numeroPage) throws IOException{

//Partie concernant l'entête non variable de cette Fiche
/* Ouverture des flux */

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];

/* Ecriture du début du fichier dans le fichier final */
WriteHTML(debutfilename,fichierFinal,buffer,0);

/* Fermeture des flux */
debutfilename.close();

/*Partie concernant la partie variable de cette Fiche*/

/* Ecriture des données variables dans un fichier qi va être relu après */
FileWriter milieufilename =new FileWriter("/home/fripette/workspace/FilePrinter/milieuFicheRecap.html");

String intro= "Codification des échantillons prélevés";
milieufilename.write(intro);

String baliseDebut="

\";
milieufilename.write(baliseDebut);

String borneDebut=\"1.\";

String borneDEBUT=borneDebut+datePrelev+\".\"+idCentre+\".\"+numeroPage;

String borneFin=\"\";
String borneFIN=borneFin+datePrelev+\".\"+idCentre+\".\"+numeroPage;

String un= \"----
";
String trois=", à, ";
String cinq=", \";

for(int repetition=0; repetition<=9;repetition++){
String reslt=un+borneDEBUT+trois+borneFIN+cinq;
milieufilename.write(reslt);
}

String baliseFin="

";

milieufilename.write(baliseFin);
milieufilename.close();

/* Ecriture de la partie variable dans le fichier final */
FileInputStream milieu =new FileInputStream("/home/fripette/workspace/FilePrinter/milieuFicheRecap.html");
byte buffer3[]= new byte[512*1024];
WriteHTML(milieu,fichierFinal,buffer3,0);

//Partie concernant la partie finale non variable de cette Fiche
FileInputStream finfilename =new FileInputStream("/home/fripette/workspace/FilePrinter/finFicheRecap.html");
byte buffer2[]= new byte[512*1024];
WriteHTML(finfilename,fichierFinal,buffer2,0);

/* Fermeture des flux */
finfilename.close();
fichierFinal.close();

//IMPORTANT :pour insérer une page .html dans le JTextPane texte.read(fichierFinal,doc);
FileInputStream ficheFinal = new FileInputStream("/home/fripette/workspace/FilePrinter/FinalFicheRecap.html");

// au final : on relit le fichier final en .html dans lequel j'ai ajouté mes bouts de .html
texte.read(ficheFinal,doc);

}

Bon ce que j'ai essayé de faire c'est :

ajouter un logo : mais j'ai mis le source dans le code html mais celui ci n'est pas pris en compte par le JTextPane (ou JEditorPane):

<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<META http-equiv ="Content-Type" content="text/html; charset=ISO-8859-1">

<table cols="2" width="80%" >
<TR>
<TD ALIGN="LEFT" width="30%">
"/home/fripette/workspace/FilePrinter/logo.jpg" style="height:100%">
</TD>
<TD ALIGN="CENTER" width="60%" bgcolor="#C0C0C0">
Fiche R&eacute;capitulative des pr&eacute;l &egrave;vements</TD>
</TR>
 
<TR>
<TD></TD>



De plus j'essais de mettre en forme mon formulaire mtnt: affiner la police et la taille de celle ci. (par en bleu au début avec le StyleSheet).

Autre chose que j'aimerai faire c'est rajouté/complété ma partie variable :

en mettant une partie de type combobox dans la variable borneDEBUT et borneFIN.

UN exemple :

si ma borneDEBUT est 1. .250308.GRA.01.

Dans l'espace blanc j'aimerai avoir un combobox avec différents choix : exemple de codes internes : EBM;LRS1,LRS2 ....


J'espère avoir été plus claire!

Help !
0
Rejoignez-nous