cs_harleen
Messages postés22Date d'inscriptionlundi 10 novembre 2008StatutMembreDernière intervention20 juillet 2009
-
3 juil. 2009 à 16:47
cs_harleen
Messages postés22Date d'inscriptionlundi 10 novembre 2008StatutMembreDernière intervention20 juillet 2009
-
6 juil. 2009 à 10:40
Bonjour à tous,
Je travaille actuellement sur une appli de conversion d'un standard XML vers un deuxième standard XML et vice-versa.
Pour cela, l'utilisateur utilise un premier JFileChooser, afin de
sélectionner le fichier .xml qui l'intéresse.J'ai fait tous les
contrôles pour m'assurer qu'il s'agit bien d'un XML d'une part (et non
d'un mp3, jpg etc...), amis qu'il s'agit bien d'un XML de l'un ou
l'autre des 2 standards XML afin d'activer une deuxième zone de texte
dans laquelle l'utilisateur saisira le nom du fichier de sortie.
Il a ensuite une zone de texte dans laquelle il saisit le nom du
fichier de sortie .xml qui va être crée à la suite de la traduction.De
même que pour la zone de texte précédente, j'ai fait tous les contrôles
pour m'assurer que ce fichier de sortie est bien un .xml.
Tout cela marche parfaitement, et le fichier de sortie est crée dans le même répertoire que le fichier d'entrée.
Je souhaite désormais optimiser cette appli en rajoutant un bouton
parcourir à côté de la zone de texte de sortie, afin que l'utilisateur
puisse sauver son fichier où il le souhaite.
J'ai donc crée un JFileChooser à côté de la zone de texte du fichier de
sortie, visant à sélectionner par exemple un fichier .xml que l'on
souhaiterait écraser et par la suite l'endroit où l'on souhaiterait
créer le fichier traduit de sortie.
J'ai d'ores et déjà fait les contrôles sur les extensions, et vérifié
que le fichier sélectionné existait bien et ceci fonctionne.
J'ai un fichier dans mes documents qui s'appelle Fich1.xml, et je le
sélectionne avec mon JFileChooser.Un JOptionPane de confirmation
demande à l'utilisateur s'il souhaite écraser ce fichier.xml.
Or, dans le cas où l'utilisateur accepte, un fichier du même nom que
celui venant d'être sélectionné est crée dans le workspace, et non à
l'endroit où j'ai sélectionné mon fichier.
Comment faire alors pour que le fichier sélectionné dans mes documents soit écrasé à cet endroit-ci??
Je comprends que c'est un problème pas très facile à expliquer ni à
comprendre, n'hésitez pas si je peux reformuler quoi que ce soit.
En vous remerciant d'avance
J'ai ainsi dans mes documents un fichier s'appelant fichier1.xml
//zones de texte
private JTextField txtlocalPath = new JTextField(32);
private JTextField txtSortie = new JTextField(32);
//fichiers d'entrée et de sortie
File inputFile;
File outputFile;
//boutons
private JButton btnparcourirentree = new JButton("Parcourir...");
private JButton btnparcourirsortie = new JButton("Parcourir...");
private JButton btntradsimple = new JButton("ebXML -> XML");
private JButton btntradcomplique = new JButton("XML -> ebXML");
//private JButton btnZero = new JButton ("Remise à zero");
//creation du panel
JPanel panel = new JPanel();
//enumération
private XmlType xmlType;
//liste des erreurs
private List<Error> listErrors = new ArrayList<Error>();
//JLabel pour afficher message d'erreur
JTextArea message_erreur = new JTextArea(5,40);
//Constructeur de la fenêtre
public FenetreSaisie(){
super();
txtlocalPath.setEditable(false);
inputFile = null;
outputFile = null;
xmlType = null;
setTitle("Utilitaire de conversion");//On donne un titre à l'application
//initialisation Fenetre
privatevoid build(){
setSize(500,350); //On donne une taille à notre fenêtre
setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
setResizable(false); //On permet le redimensionnement
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
setContentPane(buildContentPane());
message_erreur.setText("Veuillez sélectionner un fichier en entrée");
message_erreur.setForeground(Color.BLUE);
btnparcourirsortie.setEnabled(false);
}
private JPanel buildContentPane(){
//affectation du Layout GridBagLayout au panel
panel.setLayout(new GridBagLayout());
//création des composants
label_presentation_fenetre = new JLabel("Informations");
//creation du bouton Parcourir afin de chercher la source
btnparcourirentree.addActionListener(new BoutonParcourirEntreeListener());
btnparcourirentree.setFocusable(false);
btnparcourirsortie.addActionListener(new BoutonParcourirSortieListener());
btnparcourirsortie.setFocusable(false);
//creation de labels pour informer l'utilisateur
label_entree = new JLabel("Fichier à traduire");
label_sortie = new JLabel("Saisir le nom du fichier XML de sortie");
//creation du bouton Traduire ebXML vers XML
btntradsimple.addActionListener(new BoutonTradSimpleListener());
btntradsimple.setToolTipText("Traduit du ebXML vers le XML simplifié");
//creation du bouton traduire XML vers ebXML
btntradcomplique.addActionListener(new BoutonTradCompliqueListener());
btntradcomplique.setToolTipText("Traduit du XML simplifié vers le ebXML");
//creation du bouton de remise à zero
//btnZero.addActionListener(new BoutonZeroListener());
//Ajout des composants en spécifiant les contraintes
GridBagConstraints gbc = new GridBagConstraints();
//DocumentListener rajouté pour les zones de texte entrée et sortie
txtlocalPath.getDocument().addDocumentListener(new DocumentListener(){
@Override
publicvoid changedUpdate(DocumentEvent e){
VerifAll();
}
//classe interne permettant d'écouter le bouton Parcourir pour la sélection d'un fichier en entrée
//on utilise un JFileChooser
class BoutonParcourirEntreeListener implements ActionListener{
@Override
publicvoid actionPerformed(ActionEvent event)
{
message_erreur.setText("");
txtSortie.setText("");
//rajout d'un filtre afin de ne garder que les documents .xml
ExampleFileFilter filter = new ExampleFileFilter();
filter.addExtension("xml");
filter.setDescription("fichiers .xml");
chooser.setFileFilter(filter);
//on ne garde que les fichiers
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int choix = chooser.showOpenDialog(null);
//cas où on sélectionne un fichier à l'aide du bouton Parcourir
if(choix == JFileChooser.APPROVE_OPTION){
inputFile = chooser.getSelectedFile();
if(inputFile.exists()){
txtlocalPath.setText(inputFile.getPath());
txtSortie.requestFocus();
}
else{
message_erreur.setText("Le fichier "+inputFile.getName()+ " n'existe pas");
txtlocalPath.setText("");
}
}
//pas besoin de rajouter où l'utilisateur annule l'opération : JFileChooser.CANCEL_OPTION
}
}//fin classe BoutonParcourirListener
//classe interne permettant d'écouter le bouton Parcourir pour la sélection d'un fichier ou d'un répertoire en sortie
//on utilise un JFileChooser
//si on sélectionne un répertoire, alors va créer le fichier à cet endroit,
//si on sélectionne un fichier, alors va deamnder à écraser le fichier ou non.
class BoutonParcourirSortieListener implements ActionListener{
@Override
publicvoid actionPerformed(ActionEvent event)
{
message_erreur.setText("");
txtSortie.setText("");
//rajout d'un filtre afin de ne garder que les documents .xml
ExampleFileFilter filter = new ExampleFileFilter();
filter.addExtension("xml");
filter.setDescription("fichiers .xml");
chooser.setFileFilter(filter);
//soit on prend les fichiers, soit on prend les répertoires
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int choix = chooser.showOpenDialog(null);
//cas où on sélectionne un fichier à l'aide du bouton Parcourir
if(choix == JFileChooser.APPROVE_OPTION){
outputFile = chooser.getSelectedFile();
JOptionPane jop = new JOptionPane();
int option = jop.showConfirmDialog(null, "Le fichier existe déjà, souhaitez-vous l'écraser ?", "Fichier existant", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if(option == JOptionPane.NO_OPTION || option==JOptionPane.CANCEL_OPTION)
{
btntradsimple.setEnabled(false);
btntradcomplique.setEnabled(false);
}
else{//si l'utilisateur clique sur Yes, alors le fichier qui est existant sera écrasé
if(xmlType == XmlType.COMPLEX){
txtSortie.setText(outputFile.getPath());
btntradsimple.setEnabled(true);
message_erreur.setText("le fichier "+outputFile.getName()+" sera écrasé");
/* File f = chooser.getSelectedFile();
* if(!f.canWrite()){//petit test pour eviter les exceptions
JOptionPane.showMessageDialog(this,
"<html>Impossible d'écrire ici !!!</html>",
"Erreur", JOptionPane.ERROR_MESSAGE);
return;
}
try {
FileWriter fw = new FileWriter(chooser.getSelectedFile());
fw.write(getArea().getText());//ecriture du texte
fw.flush();
fw.close();
} catch (Exception ioe) {
ioe.printStackTrace();
}
*
*
* */
}
else{
message_erreur.setText("Veuillez sélectionner un fichier .xml");
message_erreur.setForeground(Color.RED);
}
}
else{//si le fichier n'existe pas
if(xmlType == XmlType.COMPLEX){
message_erreur.setText("Le fichier "+outputFile.getName()+ " n'existe pas");
}
elseif(xmlType == XmlType.SIMPLE){
message_erreur.setText("Le fichier "+outputFile.getName()+ " n'existe pas");
}
}
}
}//fin du if (choix == JFileChooser.APPROVE_OPTION)
}//fin classe BoutonParcourirSortieListener
/* */
//classe BoutonTradSimpleListener permettant d'écouter le bouton btntradsimple : pour passer du ebXML vers le XML simple
class BoutonTradSimpleListener implements ActionListener{
publicvoid actionPerformed(ActionEvent arg0){
//récupérer le contenu de la textBox et traduire
//on crée une fabrique de transformeurs
TransformerFactory factory = TransformerFactory.newInstance();
//fichier xsl de transformation
File fxsl = new File("transfo.xsl");
//fichier xml source de type source
Source xmlSource = new StreamSource(decoupeURL());
//nom du fichier de sortie de type Result
Result sortie = new StreamResult(txtSortie.getText());
//transformer
Transformer transformer;
try{
//on récupère un transformeur à partir d'une fabrique de transformeurs
transformer = factory.newTransformer(new StreamSource(fxsl));
/*Utilisation d'un parser DOM ou SAX sans DTD ou xml schema pour la validation,
* s'il ya une erreur de parsing alors le fichier XML n'est pas bien formé càd NON XML.
*/
DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
DocumentBuilder constructeur = fabrique.newDocumentBuilder();
// lecture du contenu d'un fichier XML avec DOM
File xml = new File(decoupeURL());
Document document = constructeur.parse(xml);
//transformation en prenant en paramètre le fichier xml source et fait le fichier xml de sortie
transformer.transform(xmlSource, sortie );
//message informant que la traduction a bien été faite
message_erreur.setText("Traduction simple effectuée");
message_erreur.setForeground(Color.green);
}
catch(TransformerConfigurationException e){
// TODO Auto-generated catch block
e.printStackTrace();
}catch(TransformerException e){
// TODO Auto-generated catch block
e.printStackTrace();
}catch(ParserConfigurationException e){
e.printStackTrace();
}catch(SAXException se){
//C'est un fichier Non Xml
}catch(IOException ioe){
// TODO Auto-generated catch block
}
}
}//fin de la classe BoutonTradSimpleListener
//classe BoutonTradCompliqueListener permettant d'écouter le bouton btntradcomplique : pour passer du XML simple au ebXML
class BoutonTradCompliqueListener implements ActionListener{
publicvoid actionPerformed(ActionEvent arg0){
//récupérer le contenu de la textBox et traduire
System.setProperty("javax.xml.transform.TransformerFactory",
"net.sf.saxon.TransformerFactoryImpl");
//on crée une fabrique de transformeurs
TransformerFactory factory = TransformerFactory.newInstance();
//fichier xsl de transformation
File fxsl = new File("transfo_eb.xsl");
//fichier xml source de type source
Source xmlSource = new StreamSource(decoupeURL());
//fichier xml de sortie de type Result
Result sortie = new StreamResult(txtSortie.getText());
//transformer
Transformer transformer;
try{
//on récupère un transformeur à partir d'une fabrique de transformeurs
transformer = factory.newTransformer(new StreamSource(fxsl));
/*Utilisation d'un parser DOM ou SAX sans DTD ou xml schema pour la validation,
* s'il ya une erreur de parsing alors le fichier XML n'est pas bien formé càd NON XML.
*/
DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
DocumentBuilder constructeur = fabrique.newDocumentBuilder();
// lecture du contenu d'un fichier XML avec DOM
File xml = new File(decoupeURL());
Document document = constructeur.parse(xml);
//transformation en prenant en paramètre le fichier xml source et fait le fichier xml de sortie
transformer.transform(xmlSource, sortie );
}catch(TransformerConfigurationException e){
// TODO Auto-generated catch block
e.printStackTrace();
}catch(TransformerException e){
// TODO Auto-generated catch block
e.printStackTrace();
}catch(ParserConfigurationException e){
// TODO Auto-generated catch block
e.printStackTrace();
}catch(SAXException e){
// TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e){
// TODO Auto-generated catch block
}
}
}//fin de la classe BoutonTradCOmpliqueListener
/*méthode permettant de découper l'adresse absolue qui est écrite dans le textarea du chemin : txtlocalPath
* 1) permet de récupérer l'URL du fichier xml à traduire
* 2) ne prend que le fichier .xml de cette URL
*/
public String decoupeURL(){
String s = txtlocalPath.getText();
File file = new File(s);
s = file.getName();
return s;
}
/*méthode permettant d'extraire l'extension d'un fichier
* On se servira de cette méthode pour s'assurer notamment que :
* les fichiers qui sont passés en entrée et les noms de fichiers de sortie sont bien des .xml
*/
publicstatic String getFileExtension(String NomFichier){
File tmpFichier = new File(NomFichier);
tmpFichier.getName();
int posPoint = tmpFichier.getName().lastIndexOf('.');
if(0 < posPoint && posPoint <= tmpFichier.getName().length() - 2){
return tmpFichier.getName().substring(posPoint + 1);
}
return"";
}
/*on se place sur la racine, on vérifie alors :
* - soit que le fichier d'entrée est un document ebXML
* -soit que le fichier d'entrée est un document XML simple
* - soit ni l'un ni l'autre, alors erreur...*/
if(nomRacine.equals("Dematerialisation_prix")){
xmlType = XmlType.SIMPLE;
txtSortie.setEditable(true);
btnparcourirsortie.setEnabled(true);
message_erreur.setText("Saisir le nom du document de sortie d'extension.xml.\nSi vous souhaitez changer d'emplacement pour le fichier de sortie : \n cliquez sur parcourir");
message_erreur.setForeground(Color.BLUE);
message_erreur.setLineWrap(true);
}elseif(nomRacine.equals("itt:InvitationToTenderDetails")){
xmlType = XmlType.COMPLEX;
txtSortie.setEditable(true);
btnparcourirsortie.setEnabled(true);
message_erreur.setText("Saisir le nom du document de sortie d'extension.xml.\nSi vous souhaitez changer d'emplacement pour le fichier de sortie : \n cliquez sur parcourir");
message_erreur.setForeground(Color.BLUE);
message_erreur.setLineWrap(true);
}
}catch(ParserConfigurationException e1){
xmlType = null;
listErrors.add(Error.PARSE_ERROR);
}catch(SAXException e1){
xmlType = null;
listErrors.add(Error.SAX_ERROR);
}catch(IOException e1){
xmlType = null;
listErrors.add(Error.IO_ERROR);
message_erreur.setText("Le fichier XML n'est ni un ebXML, ni un XML simple, veuillez recommencer la saisie");
message_erreur.setForeground(Color.RED);
message_erreur.setLineWrap(true);
//vérification du document de sortie
publicvoid VerificationSortie(){
boolean afficher = (txtSortie.getText().length() > 4 && ".xml".equalsIgnoreCase(txtSortie.getText().substring(txtSortie.getText().length()-4)));
//tonBouton.setVisible(afficher);
outputFile = new File(txtSortie.getText());
if(outputFile.exists()){
// Si ce fichier existe déjà, on s'arrête pour ne pas le modifier.
// 'System.err' est le flux d'erreur standard, qui s'affiche normalement
// dans le terminal qui a servi à lancer l'exécution du programme.
JOptionPane jop = new JOptionPane();
int option = jop.showConfirmDialog(null, "Le fichier existe déjà, souhaitez-vous l'écraser ?", "Fichier existant", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
//if(option != JOptionPane.NO_OPTION && option != JOptionPane.CANCEL_OPTION && option != JOptionPane.CLOSED_OPTION)
if(option == JOptionPane.NO_OPTION || option==JOptionPane.CANCEL_OPTION)
{
btntradsimple.setEnabled(false);
btntradcomplique.setEnabled(false);
}
else{//si l'utilisateur clique sur Yes, alors le fichier qui est existant sera écrasé
if(xmlType == XmlType.COMPLEX){
btntradsimple.setEnabled(afficher);
message_erreur.setText("le fichier "+outputFile.getName()+" sera écrasé");
}
elseif(xmlType == XmlType.SIMPLE){
btntradcomplique.setEnabled(afficher);
message_erreur.setText("le fichier "+outputFile.getName()+" sera écrasé");
}
}//fin du else
}//fin du if(outputFile.exists())
else{//si le fichier n'existe pas, on peut le créer
if(xmlType == XmlType.COMPLEX){
//enum pour les erreurs
privateenum Error {
UNKNOW_INPUT_FILE,
UNDEFINED_OUTPUT_FILE,
IO_ERROR,
SAX_ERROR,
PARSE_ERROR;
}
//enum pour les deux types de dic XML
privateenum XmlType {
SIMPLE,
COMPLEX;
}
publicstaticvoid main(String[] args){
//On crée une nouvelle instance de notre FenetreTexte
FenetreSaisie fenetre = new FenetreSaisie();
fenetre.setVisible(true);//On la rend visible
}
}//fin de la classe
cs_harleen
Messages postés22Date d'inscriptionlundi 10 novembre 2008StatutMembreDernière intervention20 juillet 2009 6 juil. 2009 à 10:40
Bonjour
Je ne sais pas si j'ai mal formulé mon problème...
J'ai un JFileChooser en entrée avec lequel je sélectionne un fichier en entrée, et je souhaiterais enregistrer un fichier de sortie à un autre endroit que je sélectionnerai justement avec un deuxième JFileChooser.
Pour le moment, le fichier de sortie est enregistré dans mon workspace, et non à l'endroit choisi avec le JFileChooser de sortie...
Pouvez-vous me donner quelques pistes s'il vous plait?