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

2D Java Discussion :

[PrinterJob][Graphics2D] Multi pages


Sujet :

2D Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 44
    Points : 34
    Points
    34
    Par défaut [PrinterJob][Graphics2D] Multi pages
    Bonjour,

    Je cherche à imprimer un Graphics2D qui est assez long sur plusieurs pages. J'ai donc farfouiller sur les topics qui en parlent (http://www.developpez.net/forums/d10...primer-jtable/, http://www.developpez.net/forums/d23...ob-graphics2d/ et http://www.developpez.net/forums/showthread.php?t=53139) mais je n'arrive pas à les adapter à mon code. Mon problème c'est que la première page marche nikel mais les autres moins .

    Quelqu'un pourrait me corriger l'erreur que je n'aurais pas remarqué ? Voici 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
    @Override public int print(Graphics g, PageFormat pf, int index_page) {
        int htext = (int)g.getFontMetrics().getStringBounds("", g).getHeight();
        int zone_imprimable = (int)(Math.ceil(pf.getImageableHeight())-15-htext);
     
        // Calculer le nombre de page à imprimer
        nb_page = Math.max (1, ((nb_ligne*ht)/zone_imprimable));
     
        if (index_page >= nb_page) return NO_SUCH_PAGE;
     
        Graphics2D g2d = (Graphics2D)g;
     
        //Définir la hauteur du graphique sur une page
        Dimension dim  = new Dimension(790, (int)Math.ceil(pf.getImageableHeight()));
     
        // Positonne le graphique à l'origine de la zone d'impression
        g2d.translate((int)pf.getImageableX()+30, (int)pf.getImageableY());
     
        // Dimension de la page
        double pageWidth = pf.getImageableWidth(); //page width
        double pageHeight = pf.getImageableHeight(); // Page height
     
        // Redimensionner en largeur si trop grand
        if (dim.width > pageWidth) {
            double factor = pageWidth/dim.width; // Echelle de redimensionnement
            g2d.scale(factor, factor); // Redimensionner le graphique
            pageWidth /= factor; // Modifier la taille du graphique
            pageHeight /= factor;
        }
        // Centrer le graphique sur la page
        g2d.translate((pageWidth-dim.width)/2,(pageHeight-dim.height)/2);
     
        // Découpe le graphique en fonction de la page courante
        if (nb_page>1){
           	g2d.setClip(0, zone_imprimable*index_page, 790, zone_imprimable);
        }
     
        dessinerEdt(g2d, dim);
     
        return PAGE_EXISTS;
    }
    PS : "nb_ligne" est le nombre de ligne que comprends mon tableau et "ht" la hauteur d'une ligne.

    Encore merci pour votre aide.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 44
    Points : 34
    Points
    34
    Par défaut
    Personne ne peut m'aider ?

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    d'ou vient nb_page et comment est-il calcule, que vaut-il lors d'une execution ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 44
    Points : 34
    Points
    34
    Par défaut
    Tout d'abord merci pour ta réponse mais je ne vois pas ce que je peux rajouter comme données pour répondre à ta question alors je remet en évidence les parties importantes de mon précédent post en simplifiant un peu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        int zone_imprimable = (int)pf.getImageableHeight();
     
        // Calculer le nombre de page à imprimer
        nb_page = (nb_ligne*ht)/zone_imprimable;
    PS : "nb_ligne" est le nombre de ligne que comprends mon tableau et "ht" la hauteur d'une ligne.

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Oui mais quelle est sa valeur lors de l'execution ?

    Et sinon pour avoir de l'aide plus rapidement, le plus simple est de mettre en place un code de test unitaire avec un jeu de donnees bidon simples pour que tout un chacun puisse directement l'executer et le tester sur son propre PC plutot que de penser que les gens vont passer des heures et des heures a re-coder un exemple -surtout quand il s'agit de GUI ou de graphisme- (qui sera au final digferent de ton code et donc potentiellement sans ton probleme).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 44
    Points : 34
    Points
    34
    Par défaut Code exemple simplifié
    Ok voilà le code exemple simplifié :

    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
    @Override public int print(Graphics g, PageFormat pf, int index_page) {        
        // Calculer le nombre de page à imprimer
        nb_page = 3; // (int)1980/532
     
        if (index_page >= nb_page) return NO_SUCH_PAGE;
     
        Graphics2D g2d = (Graphics2D)g;
     
        //Définir la hauteur du graphique sur une page
        Dimension dim  = new Dimension(790, (int)pf.getImageableHeight());
     
        // Positonne le graphique à l'origine de la zone d'impression
        g2d.translate((int)pf.getImageableX()+30, (int)pf.getImageableY());
     
        // Dimension de la page
        double pageWidth = pf.getImageableWidth(); //page width
        double pageHeight = pf.getImageableHeight(); // Page height
     
        // Redimensionner en largeur si trop grand
        if (dim.width > pageWidth) {
            double factor = pageWidth/dim.width; // Echelle de redimensionnement
            g2d.scale(factor, factor); // Redimensionner le graphique
            pageWidth /= factor; // Modifier la taille du graphique
            pageHeight /= factor;
        }
        // Centrer le graphique sur la page
        g2d.translate((pageWidth-dim.width)/2,(pageHeight-dim.height)/2);
     
        // Découpe le graphique en fonction de la page courante
        if (nb_page>1){
           	g2d.setClip(0, 532*index_page, 790, 532);
        }
     
        g2d.fillRect(0, 0, dim.width, 1980);
     
        return PAGE_EXISTS;
    }
    Images attachées Images attachées    

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 44
    Points : 34
    Points
    34
    Par défaut
    Personne ne peux m'aider ?

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Je t'ai deja indique ce qu'il te fallait nous fournir pour qu'on puisse t'aider...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 44
    Points : 34
    Points
    34
    Par défaut
    Et je t'ai fournis ce que tu m'a demandé... sinon dis-moi plus spécifiquement ce qu'il te manque encore...

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par bouye Voir le message
    Et sinon pour avoir de l'aide plus rapidement, le plus simple est de mettre en place un code de test unitaire avec un jeu de donnees bidon simples pour que tout un chacun puisse directement l'executer et le tester sur son propre PC plutot que de penser que les gens vont passer des heures et des heures a re-coder un exemple -surtout quand il s'agit de GUI ou de graphisme- (qui sera au final digferent de ton code et donc potentiellement sans ton probleme).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 44
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par fady005 Voir le message
    Ok voilà le code exemple simplifié :

    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
    @Override public int print(Graphics g, PageFormat pf, int index_page) {        
        // Calculer le nombre de page à imprimer
        nb_page = 3; // (int)1980/532
     
        if (index_page >= nb_page) return NO_SUCH_PAGE;
     
        Graphics2D g2d = (Graphics2D)g;
     
        //Définir la hauteur du graphique sur une page
        Dimension dim  = new Dimension(790, (int)pf.getImageableHeight());
     
        // Positonne le graphique à l'origine de la zone d'impression
        g2d.translate((int)pf.getImageableX()+30, (int)pf.getImageableY());
     
        // Dimension de la page
        double pageWidth = pf.getImageableWidth(); //page width
        double pageHeight = pf.getImageableHeight(); // Page height
     
        // Redimensionner en largeur si trop grand
        if (dim.width > pageWidth) {
            double factor = pageWidth/dim.width; // Echelle de redimensionnement
            g2d.scale(factor, factor); // Redimensionner le graphique
            pageWidth /= factor; // Modifier la taille du graphique
            pageHeight /= factor;
        }
        // Centrer le graphique sur la page
        g2d.translate((pageWidth-dim.width)/2,(pageHeight-dim.height)/2);
     
        // Découpe le graphique en fonction de la page courante
        if (nb_page>1){
           	g2d.setClip(0, 532*index_page, 790, 532);
        }
     
        g2d.fillRect(0, 0, dim.width, 1980);
     
        return PAGE_EXISTS;
    }

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ok, dialogue de sourd.

    Soit tu fais l'effort de creer un test unitaire et de fournir une classe executable permettant de verifier ton probleme et ainsi que toutes les classes requises (le Printable entre autre) pour le faire tourner directement avec des donnees (des donnees bidons, pas les vraies donnees de ton application) permettant de simuler ce que contient ta table, soit ne t'attends pas a plus d'aide de ma part.

    Comme d'autres membres, j'ai d'autres priorites que de passer mon temps a recoder integralement et essayer de simuler le probleme que tu rencontres. Et je ne vais pas non plus faire tout ton travail a ta place.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 44
    Points : 34
    Points
    34
    Par défaut
    Voilà ! Je peux pas faire plus simple... Tu copie et tu colle dans une nouvelle classe et tu exécute.

    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
    import java.awt.*;
    import java.awt.print.*;
    import javax.swing.*;
     
    public class Test extends javax.swing.JFrame implements Printable {
    	private javax.swing.JButton print_graphics;
     
    	public Test(){
            	initComponents();
            	setTitle("Test impression");
            	Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
            	setLocation((screen.width - getSize().width)/2,(screen.height - getSize().height)/3);
            	//Ask for window decorations provided by the look and feel. 
            	setDefaultLookAndFeelDecorated(true);
            	setVisible(true);
            	setResizable(false);
            	setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    	}
     
    	private void initComponents() {
    		print_graphics = new javax.swing.JButton("Imprimer");
            	print_graphics.setActionCommand("print");
            	print_graphics.addActionListener(new java.awt.event.ActionListener() {
                		@Override public void actionPerformed(java.awt.event.ActionEvent evt) {
                    lancer_impression();
                		}
            	});
    		add(print_graphics, java.awt.BorderLayout.CENTER);
    		pack();
    	}
     
    	private void lancer_impression() {
     
            	Paper paper = new Paper();
            	int margin = 30;
            	paper.setImageableArea(margin, margin, paper.getWidth() - (margin * 2),
                    paper.getHeight() - (margin * 2));
     
            	PageFormat format = new PageFormat();
            	format.setOrientation(PageFormat.LANDSCAPE);
            	format.setPaper(paper);
     
            	PrinterJob printJob = PrinterJob.getPrinterJob();
            	printJob.setPrintable((Printable)this, format);
            	printJob.setJobName("print_test");
            	if (printJob.printDialog()) // boite de dialogue d'impression
                		try {
                    		printJob.print();
                	} catch (PrinterException exception) {
                    	JOptionPane.showMessageDialog(this, exception);
                    	exception.printStackTrace();
                	}
    	}
     
     
        @Override public int print(Graphics g, PageFormat pf, int index_page) {        
            // Calculer le nombre de page à imprimer
            int nb_page = 3; // (int)1980/532
     
            if (index_page >= nb_page) return NO_SUCH_PAGE;
     
            Graphics2D g2d = (Graphics2D)g;
     
            //Définir la hauteur du graphique sur une page
            Dimension dim  = new Dimension(760, (int)pf.getImageableHeight());
     
            // Positonne le graphique à l'origine de la zone d'impression
            g2d.translate((int)pf.getImageableX(), (int)pf.getImageableY());
     
            // Dimension de la page
            double pageWidth = pf.getImageableWidth(); //page width
            double pageHeight = pf.getImageableHeight(); // Page height
     
            // Redimensionner en largeur si trop grand
            if (dim.width > pageWidth) {
                double factor = pageWidth/dim.width; // Echelle de redimensionnement
                g2d.scale(factor, factor); // Redimensionner le graphique
                pageWidth /= factor; // Modifier la taille du graphique
                pageHeight /= factor;
            }
            // Centrer le graphique sur la page
            g2d.translate((pageWidth-dim.width)/2,(pageHeight-dim.height)/2);
     
            // Découpe le graphique en fonction de la page courante
            if (nb_page>1){
           	    g2d.setClip(0, 532*index_page, 760, 532);
            }
     
            g2d.fillRect(0, 0, dim.width, 1980);
     
            return PAGE_EXISTS;
        }
     
        public static void main(String[] args) {
            Toolkit.getDefaultToolkit().setDynamicLayout(true);
            System.setProperty("sun.awt.noerasebackground","true");
     
            // Recuperer l'apparence par defaut du systeme
            String nativeLF = UIManager.getSystemLookAndFeelClassName();
     
            // Installer l'apparence
            try {
                UIManager.setLookAndFeel(nativeLF);
            } catch (InstantiationException e) {
            } catch (ClassNotFoundException e) {
            } catch (UnsupportedLookAndFeelException e) {
            } catch (IllegalAccessException e) {
            }
     
            Test f=new Test();
            f.setVisible(true);
        }
    }
    Merci d'avance pour ton aide.

  14. #14
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    J'avoue que c'est toujours autant sympa de faire du deboggage visuel avec un code qui ne fait rien que dessiner des rectangles noirs ce qui ne donne aucun retour ni indication visuel sur l'endroit ou on est positionne. Un peu d'imagination que diable !

    Alors :
    1. Lancement du programme de test dans l'EDT (lancer de l'AWT/Swing depuis une autre thread c'est mal).
    2. On se cree une image de test sim qui simule le contenu a imprimer. Dans mon cas c'est une image en gris (pour la distinguer du fond blanc de la page) qui contient des lignes de texte dont le contenu change a chaque ligne (pour se rendre compte des problemes de decallages verticaux) et encadree de rouge (pour savoir si on a correctement imprime tout le contenu).
    3. Je la stocke sur le disque car j'aime bien verifier que je ne fais pas de betises (ce qui m'arrive aussi de temps a autre).
    4. L'API d'impression est faite de telle maniere qu'elle repose sur Java2D et donc que tu n'es pas oblige d'imprimer le resultat. Tu peux tres bien generer des images pour chacune des pages. Ca permet d'economiser du papier et la planete te dit merci pour elle.
    5. Et donc je les stocke aussi sur le disque dur ce qui me permet de verifier le resultat apres chaque impression.


    Au final : apparement tu faisais un decallage vertical dans le mauvais sens (au bout de la seconde page, l'origine (0,0) de ton image etait de plus en plus loin en dessous de la page au lieu de se trouver au dessus) et pas forcement avec le bon facteur d'echelle (en meme temps si tu avais utilise le bon facteur, la seconde page aurait ete vide egalement).

    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
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package tableprinting;
     
    import java.awt.*;
    import java.awt.font.LineMetrics;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.BufferedImage;
    import java.awt.print.*;
    import java.io.File;
    import javax.imageio.ImageIO;
    import javax.swing.*;
     
    public class Test extends javax.swing.JFrame implements Printable {
     
        private javax.swing.JButton print_graphics;
     
        public Test() {
            initComponents();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setTitle("Test impression");
            Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
            setLocation((screen.width - getSize().width) / 2, (screen.height - getSize().height) / 3);
            //Ask for window decorations provided by the look and feel.
            setDefaultLookAndFeelDecorated(true);
            setVisible(true);
            setResizable(false);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        }
     
        private void initComponents() {
            print_graphics = new javax.swing.JButton("Imprimer");
            print_graphics.setActionCommand("print");
            print_graphics.addActionListener(new java.awt.event.ActionListener() {
     
                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    lancer_impression();
                }
            });
            add(print_graphics, java.awt.BorderLayout.CENTER);
            pack();
        }
     
        private void lancer_impression() {
     
            Paper paper = new Paper();
            int margin = 30;
            paper.setImageableArea(margin, margin, paper.getWidth() - (margin * 2),
                    paper.getHeight() - (margin * 2));
     
            PageFormat format = new PageFormat();
            format.setOrientation(PageFormat.LANDSCAPE);
            format.setPaper(paper);
     
            PrinterJob printJob = PrinterJob.getPrinterJob();
            printJob.setPrintable((Printable) this, format);
            printJob.setJobName("print_test");
     
            sim = new BufferedImage(760, 1980, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = sim.createGraphics();
            Font font = new Font("Dialog", Font.PLAIN, 14);
            g2d.setFont(font);
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            try {
                g2d.setColor(Color.LIGHT_GRAY);
                g2d.fillRect(0, 0, sim.getWidth(), sim.getHeight());
                g2d.setColor(Color.DARK_GRAY);
                for (int i = 0, y = 0; y < sim.getHeight(); i++) {
                    StringBuffer buffer = new StringBuffer();
                    for (int j = 0; j < 50; j++) {
                        buffer.append(i);
                        buffer.append(" ");
                    }
                    String label = buffer.toString();
                    //System.out.println(label+"\n"+y+"/"+sim.getHeight());
                    Rectangle2D bounds = font.getStringBounds(label, g2d.getFontRenderContext());
                    LineMetrics metrics = font.getLineMetrics(label, g2d.getFontRenderContext());
                    g2d.drawString(label, 0, y + metrics.getAscent());
                    y += (int) bounds.getHeight();
                    y += metrics.getLeading();
                //System.out.println(y+"/"+sim.getHeight());
                }
                g2d.setColor(Color.RED);
                g2d.drawRect(0, 0, sim.getWidth()-1, sim.getHeight()-1);
            } finally {
                g2d.dispose();
            }
            try {
                ImageIO.write(sim, "png", new File("source.png"));
            } catch (Exception exception) {
                JOptionPane.showMessageDialog(this, exception);
                exception.printStackTrace();
            }
            if (printJob.printDialog()) {// boite de dialogue d'impression
                BufferedImage image = new BufferedImage((int) format.getWidth(), (int) format.getHeight(), BufferedImage.TYPE_INT_RGB);
                for (int result = PAGE_EXISTS, page = 0; result != NO_SUCH_PAGE; page++) {
                    //System.out.println("Doing page " + page);
                    g2d = image.createGraphics();
                    try {
                        g2d.setColor(Color.WHITE);
                        g2d.fillRect(0, 0, image.getWidth(), image.getHeight());
                        g2d.setClip((int) format.getImageableX(), (int) format.getImageableY(), (int) format.getImageableWidth(), (int) format.getImageableHeight());
                        g2d.setColor(Color.BLACK);
                        result = this.print(g2d, format, page);
                    } finally {
                        g2d.dispose();
                    }
                    try {
                        ImageIO.write(image, "png", new File("page" + page + ".png"));
                    } catch (Exception exception) {
                        JOptionPane.showMessageDialog(this, exception);
                        exception.printStackTrace();
                    }
                }
            /*
            try {
            printJob.print();
            } catch (PrinterException exception) {
            JOptionPane.showMessageDialog(this, exception);
            exception.printStackTrace();
            }
             */
            }
        }
        private BufferedImage sim;
     
        @Override
        public int print(Graphics g, PageFormat pf, int index_page) {
            // Dimension de la page
            double pageWidth = pf.getImageableWidth(); //page width
            double pageHeight = pf.getImageableHeight(); // Page height
            double contentWidth = sim.getWidth();
            double contentHeight = sim.getHeight();
            Graphics2D g2d = (Graphics2D) g.create();
            // Positonne le graphique à l'origine de la zone d'impression
            g2d.translate((int) pf.getImageableX(), (int) pf.getImageableY());        
            double factor = 1.0;
            // Redimensionner en largeur si trop grand
            if (contentWidth > pageWidth) {
                factor = pageWidth / contentWidth; // Echelle de redimensionnement
                contentWidth /= factor; // Modifier la taille du graphique
                contentHeight /= factor;
                g2d.scale(factor, factor);
            }
            // Calculer le nombre de page à imprimer
            int nb_page = (int) Math.ceil(contentHeight / pageHeight);
            //System.out.println("There will be " + nb_page + " pages.");
            //g2d.drawString("Page " + index_page + "/" + nb_page, 100, 100);
            if (index_page >= nb_page) {
                return NO_SUCH_PAGE;
            }
            g2d.translate(0, - index_page * pageHeight / factor);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2d.drawImage(sim, 0, 0, null);
            return PAGE_EXISTS;
        }
     
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
     
                public void run() {
                    Toolkit.getDefaultToolkit().setDynamicLayout(true);
                    System.setProperty("sun.awt.noerasebackground", "true");
     
                    // Recuperer l'apparence par defaut du systeme
                    String nativeLF = UIManager.getSystemLookAndFeelClassName();
     
                    // Installer l'apparence
                    try {
                        UIManager.setLookAndFeel(nativeLF);
                    } catch (InstantiationException e) {
                    } catch (ClassNotFoundException e) {
                    } catch (UnsupportedLookAndFeelException e) {
                    } catch (IllegalAccessException e) {
                    }
     
                    Test f = new Test();
                    f.setVisible(true);
                }
            });
        }
    }
    A toi d'adapter maintenant pour ton code reel (et je ne garantis pas que ce soit sans bug bien sur).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  15. #15
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 44
    Points : 34
    Points
    34
    Par défaut
    Hmmmm... Je pense que je suis encore novice en programmation Java parce que là je comprends pas grand chose :
    1. EDT c'est quoi ? et comment tu reconnais un thread d'un autre ? Le fait de créer un runnable permet d'être sur qu'on est dans le même thread mais si on ne l'utilise pas, est-ce que ça veut forcément dire qu'on utilise un autre thread ?
    2. Je veux bien créer une image temporaire mais y a des trucs que j'ai pas tout à fait digérer dans ton traitement :
    3. Ok pour la stocker sur le disque, mais dans le répertoire du projet c'est moyen quand même...
    4. Pour ce qui est de la planète ne t'inquiète pas je m'en occupe puisque je ne fait pas d'impression sur papier à chaque fois que je veux tester sinon j'aurais pas pu faire les images jointes à ce topic...
    5. Si je comprends bien ce que tu as fait dans le print, tu ne fais que déplacer à chaque fois l'image initiale sur chaque page. Ma question est quand l'image initiale est lourde, ça ne ralentit pas le processus d'impression ?


    Je joins le code simplifié par mes soins et certifié fonctionnel que j'obtiens sans l'utilisation des images...
    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
    129
     
    import java.awt.*;
    import java.awt.font.LineMetrics;
    import java.awt.geom.Rectangle2D;
    import java.awt.print.*;
    import javax.swing.*;
     
    public class Test extends javax.swing.JFrame implements Printable {
     
        private javax.swing.JButton print_graphics;
     
        public Test() {
            initComponents();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setTitle("Test impression");
            Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
            setLocation((screen.width - getSize().width) / 2, (screen.height - getSize().height) / 3);
            //Ask for window decorations provided by the look and feel.
            setDefaultLookAndFeelDecorated(true);
            setVisible(true);
            setResizable(false);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        }
     
        private void initComponents() {
            print_graphics = new javax.swing.JButton("Imprimer");
            print_graphics.setActionCommand("print");
            print_graphics.addActionListener(new java.awt.event.ActionListener() {
            	@Override public void actionPerformed(java.awt.event.ActionEvent evt) {
            		lancer_impression();
            	}
            });
            add(print_graphics, java.awt.BorderLayout.CENTER);
            pack();
        }
     
        private void lancer_impression() {
     
            Paper paper = new Paper();
            int margin = 30;
            paper.setImageableArea(margin, margin, paper.getWidth() - (margin * 2),
                    paper.getHeight() - (margin * 2));
     
            PageFormat format = new PageFormat();
            format.setOrientation(PageFormat.LANDSCAPE);
            format.setPaper(paper);
     
            PrinterJob printJob = PrinterJob.getPrinterJob();
            printJob.setPrintable((Printable) this, format);
            printJob.setJobName("print_test");
     
            if (printJob.printDialog()) {// boite de dialogue d'impression
            	try {
            		printJob.print();
            	} catch (PrinterException exception) {
            		JOptionPane.showMessageDialog(this, exception);
            		exception.printStackTrace();
            	}
            }
        }
     
        @Override public int print(Graphics g, PageFormat pf, int index_page) {
            // Dimension de la page
            double pageWidth = pf.getImageableWidth(); //page width
            double pageHeight = pf.getImageableHeight(); // Page height
            int contentWidth = 760;
            int contentHeight = 1980;
            Graphics2D g2d = (Graphics2D) g.create();
            // Positonne le graphique à l'origine de la zone d'impression
            g2d.translate((int) pf.getImageableX(), (int) pf.getImageableY());        
            double factor = 1.0;
            // Redimensionner en largeur si trop grand
            if (contentWidth > pageWidth) {
                factor = pageWidth / contentWidth; // Echelle de redimensionnement
                contentWidth /= factor; // Modifier la taille du graphique
                contentHeight /= factor;
                g2d.scale(factor, factor);
            }
            // Calculer le nombre de page à imprimer
            int nb_page = (int) Math.ceil(contentHeight / pageHeight);
            if (index_page >= nb_page) {
                return NO_SUCH_PAGE;
            }
            g2d.translate(0, - index_page * pageHeight / factor);
            Font font = new Font("Dialog", Font.PLAIN, 14);
            g2d.setFont(font);
            try {
                g2d.setColor(Color.LIGHT_GRAY);
                g2d.fillRect(0, 0, contentWidth, contentHeight);
                g2d.setColor(Color.DARK_GRAY);
                for (int i = 0, y = 0; y < contentHeight; i++) {
                    StringBuffer buffer = new StringBuffer();
                    for (int j = 0; j < 50; j++) {
                        buffer.append(i);
                        buffer.append(" ");
                    }
                    String label = buffer.toString();
                    //System.out.println(label+"\n"+y+"/"+sim.getHeight());
                    Rectangle2D bounds = font.getStringBounds(label, g2d.getFontRenderContext());
                    LineMetrics metrics = font.getLineMetrics(label, g2d.getFontRenderContext());
                    g2d.drawString(label, 0, y + metrics.getAscent());
                    y += (int) bounds.getHeight();
                    y += metrics.getLeading();
                }
                g2d.setColor(Color.RED);
                g2d.drawRect(0, 0, contentWidth-1, contentHeight-1);
            } finally {
                g2d.dispose();
            }
            return PAGE_EXISTS;
        }
     
        public static void main(String[] args) {
        	// Recuperer l'apparence par defaut du systeme
        	String nativeLF = UIManager.getSystemLookAndFeelClassName();
     
        	// Installer l'apparence
        	try {
        		UIManager.setLookAndFeel(nativeLF);
        	} catch (InstantiationException e) {
        	} catch (ClassNotFoundException e) {
        	} catch (UnsupportedLookAndFeelException e) {
        	} catch (IllegalAccessException e) {
        	}
     
        	Test f = new Test();
        	f.setVisible(true);
        }
    }
    Encore merci pour ton aide !

  16. #16
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par fady005 Voir le message
    EDT c'est quoi ?
    Houlala, il faut faire un tour directement dans la . Attention ca serait bien de commencer par assimiler les bases avant de voulor faire des trucs trop complexes ou ambitieux (la faute au prof qui a pas fait son travail la).

    Main() a sa propre Thread et des que tu es dans un composants Swing (ou AWT) tu es dans une Thread nommee EDT* (Event Dispatch Thread). Les composants ne doivent etre crees et manipules que durant l'EDT, JAMAIS depuis une autre (meme si jusqu'a present tu n'as pas rencontre de problemes, ca ne veut pas dire que tu n'en rencontreras jamais).

    *Cette Thread est lancee des l'affichage de la premiere fenetre.

    et comment tu reconnais un thread d'un autre ?
    Comment vérifier que l'on est bien dans l'EDT ?

    Le fait de créer un runnable permet d'être sur qu'on est dans le même thread mais si on ne l'utilise pas, est-ce que ça veut forcément dire qu'on utilise un autre thread ?
    Non un runnable est juste une tache disposant d'une methode run(). Cette tache peut etre executee dans la Thread courante ou une autre de divers manieres. Ici je demande a ce que la creation de la GUI soit lancee dans l'EDT (comme cela doit etre fait) donc comme l'EDT ne tournait pas jusqu'a present, elle va etre intialisee, puis demarrer et ma tache y sera executee plus tard a un moment de libre.

    Comment exécuter un traitement plus tard dans l'EDT ?
    Comment lancer un traitement dans l'EDT depuis une autre Thread ?


    PS : je genere des images ici POUR LE TEST et le DEBOGGAGE. Tu ne devrais pas avoir besoin de le faire dans ton projet final une fois que celui-ci fonctionne.

    A quoi servent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    Ce sont des indices de rendus, des flags qui indiquent au Graphics qu'il peut activer certaines options (il le fera s'il les supporte ou les ignorera s'il ne les supporte pas). Si tu vas lire la javadoc de la classe RenderingHints, tu verras qu'il y en a un qui gere l'anti-crenelage sur le texte et que le second gere la qualite de redimentionnement des images. Il y en a d'autres mais ils n'avaient que peu d'effet ici...
    Et je le fais car le resultats est plus joli ainsi (effet "L'Oreal parce que je le vaut bien !").

    C'est quoi la différence entre getAscent() et getHeight() ?
    D'apres la javadoc de la classe LineMetrics, que tu devrais lire, getAscent(), c'est la taille entre la base line (la ligne sur laquelle on ecrit - souviens-toi quand tu as appris a ecrire en primaire), et le sommet de la plus grande lettre majuscule. Tandis que le getDescent() c'est la distance entre la base line et la position la plus basse de lettres comme le 'p', par exemple, dont la queue s'etend sous la baseline. Et donc getHeight() c'est ascent + descent, comme indique dans la doc, et donc ce n'est pas la bonne methode a appeler pour positionner correctement du texte.

    Ok pour la stocker sur le disque, mais dans le répertoire du projet c'est moyen quand même...
    Je ne vois pas ou est le probleme puisque c'est uniquement destine au test et au deboggage visuel. Il n'y a pas besoin de generer d'image dans le programme final...

    Si je comprends bien ce que tu as fait dans le print, tu ne fais que déplacer à chaque fois l'image initiale sur chaque page. Ma question est quand l'image initiale est lourde, ça ne ralentit pas le processus d'impression ?
    Vi, et c'est la maniere habituelle de faire.

    A priori non*, puisque le Gaphics dispose deja d'une zone de clip qui couvre uniquement la surface de la page ; les parties hors de la vue seront ignorees.
    Tu peux essayer d'extraire une sous-image qui correspond uniquement a la zone affichable mais tu perdras probablement en performances et surtout en memoire (enfin... ca depend de la methodes que tu appelleras) et, grosso-modo, tu fais un peu double-emploi avec l'usage du clip.

    *Si l'image est vraiment trop grosse, des problemes surviendront de toute maniere quelques soit la methode d'impression.
    Il faudra alors des le depart generer des images de test couvrant des vues specifiques plutot que de manipuler une seule et unique image. Cependant cela alourdissait le test et n'est pas applicable ici puisque tu cherches a imprimer un seul et unique composant et que l'image est destinee a simuler ce composant.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  17. #17
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 44
    Points : 34
    Points
    34
    Par défaut
    Et oui, je remarque que j'ai d'énormes failles... Comme quoi programmer ne veux pas forcément dire tout connaitre.

    Encore merci pour le temps que tu me consacres . C'est toujours plus sympa que ceux qui te donnent un lien et qui te dise d'aller chercher dessus.

    La Faq Java de DVP j'étais en train de la feuilleter mais c'est quand même assez long et ça décourage à force.

    Pour l'EDT, en effet je comprends mieux comment ça fonctionne. En passant, j'ai aussi touvé ce tutoriel pas mal.

    Tu ne pense pas que c'est un peu exagéré de mettre un "SwingUtilities.invokeLater()" sur le contenu du main directement ? En fait j'ai pas vu ça très souvent mais si ça peut apporter un plus pourquoi pas ?

    Ah, j'avais pas compris que les images que tu créais c'était pour le débogage. C'est pourquoi le fait de passer par des images à chaque fois me semblais bizarre. Je comprends mieux maintenant.

    Merci aussi pour la différence entre getHeigth(), getAscent() et getDescent(). Je l'avais pas trop compris sur la JavaDoc... Vivement une JavaDoc en Français !!!

    Et enfin, pour le sujet initial , j'arrive à voir le truc. Pour mon projet, j'étais un peu pressé pour le rendre alors j'ai implémenté une fonction qui dessine un graphique par page. ça m'a aussi servi pour l'exportation directe en PDF avec iText.

    Wow, c'est fou ce qu'on peut apprendre en un topic ! C'est trop la classe ! Je met en résolu ! Vive DVP et vive bouye !

  18. #18
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par fady005 Voir le message
    Tu ne pense pas que c'est un peu exagéré de mettre un "SwingUtilities.invokeLater()" sur le contenu du main directement ? En fait j'ai pas vu ça très souvent mais si ça peut apporter un plus pourquoi pas ?
    Non bien au contaire et c'est meme la meilleure maniere de faire : le main() a sa propre Thread. Il ne faut donc pas creer la JFrame et toute l'interface dedans car on est pas dans l'EDT, c'est ainsi et pas autrement.

    Tu ne l'a pas vu souvent car la plupart des gens programment mal, ne comprennent pas comment interragir avec l'EDT ou ne savent pas ce que c'est, suivent des anciens didacticiels de Sun ou d'autres sites/livres (qui ont generalise des mauvaise pratiques dans toute une generation de programmeurs Java) et ne testent pas leur application sur un grand panel de versions de la JVM ou de platformes d'execution.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  19. #19
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 44
    Points : 34
    Points
    34
    Par défaut
    En effet tu as raison ! J'en prends note pour mes applications avenirs...

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

Discussions similaires

  1. [VB] Conseil - Multi page / Multi Tab etc ...
    Par Ooly2001 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 25/01/2006, 19h56
  2. [Debutant]Multi page sous sql serveur
    Par christophebmx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/11/2004, 17h23

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