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

Agents de placement/Fenêtres Java Discussion :

JFrame Graphics2D Enregistrement Impression


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 66
    Par défaut JFrame Graphics2D Enregistrement Impression
    Bonjour,

    Je rencontre un soucis sur l’interaction entre ma class qui générè un graphique et le bouton pouvant enregistrer et le bouton appelant la class pour imprimer le graphique.

    J'ai une classe qui génère le graphique dont voici le 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
    public class GOV_Remisage extends JPanel {
     
    	private String Nom, JourE;
    	private String[][] Trains,        Trains_Dep;
    	private Vector Voies;
    	private int NbColonne_Heure,Nb_Voie,pos,PosBD;
    	public Graphics2D g;
    	public static int Pixel_heure=120;
    	public int Pixel_Voie=500;
    	private JButton BFermer, BEnregistrer,BImprimer;
     
    	public GOV_Remisage(String nom2,String jour,Vector Voie,String[][] trains,String[][] trains_Dep) {
    		// TODO Auto-generated constructor stub
    		this.Nom=nom2;
    		this.JourE=jour;
      	    this.Voies=Voie;
      	    this.Trains=trains;
      	    this.Trains_Dep=trains_Dep;
     
      	    // Dimensione la en fonction du nb heure et du nb voie
      		NbColonne_Heure=Pixel_heure*26; // 20h à 20h
    		Nb_Voie=Voies.size(); // Nb voies par site
    		int NbColonne_HeureBarre=NbColonne_Heure+200;
    		int Nb_VoieBarre=(Nb_Voie*Pixel_Voie)+Pixel_Voie;
    		setPreferredSize(new Dimension(NbColonne_HeureBarre, Nb_VoieBarre));
     
    		// Ajout d'une barre à outils pour enregistrer et imprimer le graphique
      	    JToolBar tlbr = new JToolBar();
      	    //Création des boutons
      	    BEnregistrer=new JButton(new ImageIcon ("C:/Users/9006478A/Desktop/Remisage_TechniCentre/Outils_GestionRemisage/JAVA/Images/Enregistrer.png"));
      	    BImprimer=new JButton(new ImageIcon ("C:/Users/9006478A/Desktop/Remisage_TechniCentre/Outils_GestionRemisage/JAVA/Images/Imprimer.png"));
      	    BFermer=new JButton("Fermer");
      	    // Ajout bouton à la barre d'outil
      	    tlbr.add(BEnregistrer);
      	    tlbr.add(BImprimer);
      	    tlbr.add(BFermer);
      	    //Ajout barre d'outil à la frame
      	    this.add(tlbr);
     
      	    //Enregistre la Frame
    		BEnregistrer.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
     
    				Window window = SwingUtilities.windowForComponent(BEnregistrer);
    				if (window instanceof JFrame) {
    					JFrame frame = (JFrame) window;
    					// Déinie ou on enregistre l'image
    	  				JFileChooser fileChooser = new JFileChooser();
    	  				fileChooser.setDialogTitle("Specify a file to save"); 
    	  				int userSelection = fileChooser.showSaveDialog(frame);
    	  				if (userSelection == JFileChooser.APPROVE_OPTION) {
    	  				    File fileToSave = fileChooser.getSelectedFile();
    	  				    System.out.println("Save as file: " + fileToSave.getAbsolutePath());
    	  				    BufferedImage image = new BufferedImage(frame.getWidth(), frame.getHeight(),  BufferedImage.TYPE_INT_RGB);
    	  				    frame.paint(g);
    						g.dispose();
     
    						try {
    							ImageIO.write(image, "JPEG", fileToSave);
    						} catch (Exception e) { }
    					}
      				}
    			}
    		});
     
    		//Ferme la Frame
    		BFermer.addActionListener(new ActionListener()
    		{
    		  public void actionPerformed(ActionEvent arg0) {
    		    setVisible(false); // Ferme le graphique
    		    // Ferme la frame contenant le graphique
    		    Window window = SwingUtilities.windowForComponent(BFermer);
    			if (window instanceof JFrame) {
    				JFrame frame = (JFrame) window;
    				frame.setVisible(false);
    				frame.dispose();
    			}
    		  } 
    		});
     
    		//Imprime le graphique
    		BImprimer.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				Print p = new Print(g);
    	System.out.println(g);
    				p.imprime_ssA(g,null,1);
    			}
    		});
    	}
     
    	public void paintComponent(Graphics g1) {
            super.paintComponent(g1);
     
            g = (Graphics2D) g1;
    	g.setStroke(new BasicStroke(2));
    // ---------------------------------------------
    // Code qui dessine le graphique
    }
    J'ai crée les boutons "BEnregistrer" et "BImprimer" qui enregistre et imprime la variable "g".

    Je n'arrive pas à affecter ma variable "g" pour contenir le graphique dessiné.
    Je me doute que je les initient au mauvais endroit.

    Si je les met dans la méthode "paintComponent", il crée les interfaces d'enregistrement ou d'impression autant de fois que je bouge le graphique.

    De plus, quand je veux imprimer le graphique, il n'y a pas d'erreur dans mon code mais il crée un fichier de plus de 134 000 feuilles blanches.

    Est ce que vous pouvez m'aider?

    Merci par avance!

  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 : 56
    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,

    Il ne faut surtout pas récupérer l'instance de contexte graphique utilisée par les méthodes paintXXX, surtout dans une variable de classe (le contexte graphique utilisé pour dessiner les composants est géré par Swing et peut être utilisé à tout moment pour n'importe quel composant). En plus tu le disposes, ce qui doit pas mal faire dérailler Swing.

    Pour dessiner dans une image, il faut obtenir un contexte graphique à partir de la BufferedImage : Graphics2D g = bufferedImage.createGraphics();.

    Pour l'impression, on peut utiliser les méthodes de dessin des composants pour imprimer, mais ce n'est pas forcément adapté : un écran et un ensemble de feuilles de papier sont concrètement différents. Il vaudra mieux implémenter Printable sur la classe qui dessine ton graphique : et éventuellement, dans la méthode print, appeler directement la méthode paint(). Voir le tutoriel Oracle pour le détail de la mise en œuvre.
    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
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 66
    Par défaut
    J'ai oublié de préciser sur l'impression. la méthode imprime_ssA fait partie de la classe Print dont voici le 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
    public class Print implements Printable {
    	  private Graphics ObjectImprimer;
     
     
    	  public Print(Graphics objectImprimer) {
    	    this.setGraphicsToBePrinted(objectImprimer);
    	  }
     
    	  public void imprime_ssA(Graphics graphics, PageFormat pageFormat, int pageIndex) {
    	    PrinterJob printJob = PrinterJob.getPrinterJob();
    	    printJob.setPrintable(this);
    	    if (printJob.printDialog())
    	      try {
    	        printJob.print();
    	      } catch(PrinterException pe) {
    	        System.out.println("Error printing: " + pe);
    	      }
    	  }
    	public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
     
    			throws PrinterException {
    		// TODO Auto-generated method stub
    		return 0;
    	}
     
     
    	public Graphics getGraphicsToBePrinted() {
    		return ObjectImprimer;
    	}
     
    	public void setGraphicsToBePrinted(Graphics objectImprimer) {
    		this.ObjectImprimer = objectImprimer;
    	}
     
     
    }

  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 : 56
    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
    C'est encore pire : la classe Print prend en paramètre de constructeur un contexte graphique externe que tu ne contrôles pas, et l'impression se fait par sa méthode print() (normalement dans le contexte graphique passé en argument de cette méthode) qui ne fait rien d'autre que de dire qu'il reste des pages à imprimer : imprimer avec cette classe ne fera que vider le bac papier de ton imprimante au mieux (une impression PDF devrait causer un outofmemory). D'ailleurs, à ce propos, préférer les constantes prévues (Printable.PAGE_EXISTS et Printable.NO_SUCH_PAGE, c'est quand même plus clair)
    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
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 66
    Par défaut
    Merci pour les réponses!

    Je patauge un peu dans le domaine du graphique.
    Est ce que je génère correctement le graphique?

    Je vais voir avec votre tutoriel sur les impressions.

  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 : 56
    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
    Pour le graphique, vu qu'il n'y a pas tout le code, difficile de donner un avis complet. Mais l'idée est là : redéfinir la méthode paintComponent avec des ordres de dessin appliqué au contexte graphique passé en argument de la méthode. Simplement, la méthode devrait être protected.
    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. Comment enregistrer un JFrame en JPEG?
    Par danje dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 20/11/2016, 12h20
  2. Double JFrame et enregistrer des String dans un fichier .txt
    Par Onelove dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 29/08/2014, 12h46
  3. Réponses: 2
    Dernier message: 04/05/2010, 17h28
  4. Mise à jour enregistrements après impression
    Par alalau dans le forum Access
    Réponses: 2
    Dernier message: 17/12/2004, 17h13
  5. Réponses: 7
    Dernier message: 06/10/2004, 23h13

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