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

Interfaces Graphiques en Java Discussion :

Sauvegarder en Java


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Sauvegarder en Java
    Bonjour a tous, tout d'abord je me présente : je suis un étudiant en ingénierie des réseaux&télécoms ayant une connaissance basique en Java et j'ai un petit problème.

    j'ai crée une JFrame (nommée Programme) en java de Gestion d'un stock, mais pas encore le main.

    je souhaitais que dans la classe main, qu'a la fin de mon travail enregistrer mes données, et qu'au relancent du programme, les recharger :

    lancement du main : si fichier existe => charger
    sinon crée l'interface (dans mon cas Programme j = new Programme(); j.setVisible(true) (cela se fera la premiere fois uniquement)

    EDIT : pas vraiment la peine de faire la condition, vu que c'est pour une seule fois, je le ferai moi-même au début, dans le main donc : charger, travailler sur l'interface.

    et dans l'interface je veux un bouton qui me permet d'enregistrer; dans la fonction enregistreractionperformed, l'enregistrement sous la forme d'un fichier.

    je ne sais pas comment faire et je suis un peu a court de temps.

    si possible aussi, est-il possible de rajouter dans le main une possibilité de sauvegarde forcée en cas de problème soudains (plantage du pc) pour éviter une perte de données ? j'ai beau cherché pour ça je n'ai rien trouvé.

    Si vous pouviez m'aider merci
    Dernière modification par Invité ; 20/07/2016 à 04h04.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Et tu coince sur quoi là dedans? Lire un fichier? Détecter qu'il existe? Ajouter une action sur un bouton? Ecrire dans un fichier?


    Pour ce qui est de mettre une action en cas de plantage soudain, ce n'est pas vraiment possible. Les planages faisant disparaitre ton interface graphique, et rendant dont impossible l'utilisation du bouton sauvegarder, ne sont pas récupérable ni interceptables.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Et tu coince sur quoi là dedans? Lire un fichier? Détecter qu'il existe? Ajouter une action sur un bouton? Ecrire dans un fichier?


    Pour ce qui est de mettre une action en cas de plantage soudain, ce n'est pas vraiment possible. Les planages faisant disparaitre ton interface graphique, et rendant dont impossible l'utilisation du bouton sauvegarder, ne sont pas récupérable ni interceptables.
    je coince sur le code a utiliser pour enregistrer sous forme de données au clic du bouton mon interface, et celui pour les recharger dessus a l’exécution du main, et non je sais manipuler les boutons, mais quoi mettre dessus pour avoir ce que je veux

    Edit : en gros quel code utiliser dans le main pour avoir : lancement du main donnera Recharger a partir d'un fichier X des données dans l'interface (jm'en fous de l'extention, du codage etc), je fais ce que je veux dessus, et ensuite avant de fermer je veux réenregistrer ce que j'ai fait, donc je veux le code pour enregistrer sous forme de ce fichier X au clic du bouton avant de fermer, et rebelote.

  4. #4
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    Dans l'action du bouton (ou à la fermeture de l'application), il te suffit de créer un fichier et d'écrire les informations que tu veux dedans. Au lancement de l'application, tu testes si le fichier existe, et si c'est le cas, tu lis les informations et tu les appliques.

    Un exemple, ou je stocke la position de la fenêtre et le texte saisi dans un champ, dans un fichier que je place dans un sous-dossier du dossier home :
    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    public class DemoSaveData {
     
    	public static final String FRAME_BOUNDS = "frameBounds";
    	public static final String FIELD_TEXT = "fieldText";
     
     
    	private JFrame frame;
    	private JTextField field;
     
    	public DemoSaveData() {
    	}
     
    	public void registerFrame(JFrame frame) {
    		this.frame=frame;
    	}
    	public void registerField(JTextField field) {
    		this.field=field;
    	}
     
    	private Path getApplicationDataFile(boolean create) throws IOException {
     
    		final Path applicationDataDir = Paths.get(System.getProperty("user.home"), "monApplication"); // un dossier pour stocker les données des l'application
    		if ( create && !Files.exists(applicationDataDir) ) { // création du dossier s'il n'existe pas
    			Files.createDirectories(applicationDataDir);
    		}
    		return applicationDataDir.resolve("monFichier.dat"); // retourne un nom de fichier pour stocker les info
     
    	}
     
    	public void save() {  
    		try {
    			Path applicationDataFile = getApplicationDataFile(true);
    			// faire la sauvegarde des données
    			// par exemple, ici je sauvegarde la position de la frame et le texte dans le champ
    			try(BufferedWriter writer = Files.newBufferedWriter(applicationDataFile) ) {
    				writeData(writer, FRAME_BOUNDS, toStringData(frame.getBounds())); 
    				writeData(writer, FIELD_TEXT, field.getText()); 
    			}
    		}
    		catch(IOException e) {
    			System.err.println("Sauvegarde impossible");
    			e.printStackTrace();
    		}
    	}
     
    	private static String toStringData(Rectangle bounds) {
    		return Arrays.stream(new int[]{bounds.x,bounds.y,bounds.width,bounds.height})
    				     .mapToObj(String::valueOf)
    				     .collect(Collectors.joining(","));
    	}
     
    	private static void writeData(BufferedWriter writer, String name, String value) throws IOException {
    		writer.write(name);
    		writer.write('=');
    		writer.write(value);
    		writer.newLine(); 
    	}
     
    	public void load() {
    		try {
    			Path applicationDataFile = getApplicationDataFile(false);
    			if ( Files.exists(applicationDataFile) ) {
    				for(String line : Files.readAllLines(applicationDataFile)) {
    					String[] data = line.split("=", 2);
    					if ( data.length==2 ) {
    						switch(data[0]) {
    						case FRAME_BOUNDS:
    							frame.setBounds(readBoundsData(data[1])); 
    							break;
    						case FIELD_TEXT:
    							field.setText(data[1]);
    							break;
    						}
    					}
    				}
    			}
    		} catch (IOException e) {
    			System.err.println("Rechargement impossible");
    			e.printStackTrace();
    		}
    	}
     
    	private static Rectangle readBoundsData(String string) throws IOException {
    		try {
    			int[] bounds = Arrays.stream(string.split(","))
    					             .mapToInt(Integer::parseInt)
    					             .toArray();
    			if ( bounds.length!=4 ) {
    				throw new IOException("Not enough data: " + bounds.length + " instead of 4.");
    			}
    			return new Rectangle(bounds[0], bounds[1], bounds[2], bounds[3]);
    		}
    		catch(NumberFormatException e) {
    			throw new IOException(e);
    		}
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     
    		JTextField textField = new JTextField();
    		frame.add(textField, BorderLayout.SOUTH);
     
    		DemoSaveData saveData = new DemoSaveData();
    		saveData.registerFrame(frame);
    		saveData.registerField(textField);
     
    		frame.addWindowListener(new WindowAdapter() {
     
    			@Override
    			public void windowClosed(WindowEvent e) {
    				saveData.save(); // on sauvegarde les données quand on ferme la fenêtre
    			}
     
    		});
     
    		frame.setSize(300, 200);
    		frame.setLocationRelativeTo(null);
     
    		saveData.load();
     
    		frame.setVisible(true);
     
    	}
     
    }
    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.

  5. #5
    Invité
    Invité(e)
    Par défaut
    j'ai beaucoup d'informations dans la JFrame que j'ai, je souhaiterais la sauvegarder comme elle est a la fin(a la fermeture), et les charger comme tel a la reexecution, pas seulement un champ ou la position

    ceci est beaucoup trop éloigné de mes connaissances basiques

    Edit : je veux un moyen de pouvoir reprendre la ou j'en étais juste avant fermeture, un peu comme dans Excell ou Word ou tout autre qui propose d'enregistrer
    Dernière modification par joel.drigo ; 20/07/2016 à 14h59. Motif: Citation message précédent inutile

  6. #6
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Omar099 Voir le message
    j'ai beaucoup d'informations dans la JFrame que j'ai, je souhaiterais la sauvegarder comme elle est a la fin(a la fermeture), et les charger comme tel a la reexecution, pas seulement un champ ou la position
    Et alors ? Stocker une info ou 500, c'est pareil. Tu pourrais envisager de sérialiser la frame, mais personnellement, je n'aime pas ça :
    • Ce n'est pas vraiment fait pour stocker (et en conséquence, ça peut poser des difficulté, en particulier avec la gestion de la version de classe)
    • On prend tout ou on prend rien, ou alors il faut personnaliser : quitte à personnaliser, autant vraiment personnaliser et donc gérer soi-même le format (au moins, on n'est pas ennuyé par la version de classe).
    • En cas de MVC, il faudra sérialiser modèle et éventuellement controlleur (s'il y a des états)


    Citation Envoyé par Omar099 Voir le message
    ceci est beaucoup trop éloigné de mes connaissances basiques
    C'est-à-dire ? Quoi est trop éloigné de tes connaissances basiques ? Ecrire un texte dans un fichier et le relire et le décoder ?

    Maintenant, il existe peut-être des API qui stockent certaines informations de préférences (j'en doute, mais on ne sait jamais, puisque àa existe couramment dans certains frameworks). Mais ça restera en général assez basique (position, taille, des trucs comme ça) et ce n'est pas sûr que tu puisses personnaliser grand chose.

    Citation Envoyé par Omar099 Voir le message
    Edit : je veux un moyen de pouvoir reprendre la ou j'en étais juste avant fermeture, un peu comme dans Excell ou Word ou tout autre qui propose d'enregistrer
    Excel et Word ne font qu'afficher le document qui était édité (une copie temporaire sauvegardée à intervalle régulier en cas de crash) : pas besoin de sauvegarder l'état de fenêtre ou je ne sais quoi. Maintenant, il y a des milliers d'informations dans chacun de ces documents, et elles sont toutes stockées dans les fichiers, y'a pas à tortiller.
    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.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/10/2009, 14h03
  2. Sauvegarde en JAVA
    Par lezert dans le forum Langage
    Réponses: 3
    Dernier message: 08/05/2008, 15h36
  3. selenium RC lancer un testcase sauvegardé en .java
    Par meteteou dans le forum Test
    Réponses: 1
    Dernier message: 02/04/2008, 11h15
  4. Sauvegarder une instance d'une classe Java dans une BDD MySQL
    Par malag dans le forum Administration
    Réponses: 1
    Dernier message: 03/09/2006, 19h23

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