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 :

scollbar dans un histogramme


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2008
    Messages : 23
    Par défaut scollbar dans un histogramme
    bonjour a tous,
    je suis un débutant en swing et je dois réaliser un histogramme avec un scrollbar horizantal pour pouvoir afficher tous mes bars!
    j'ai essayer ce code mais ça ne marche pas! :
    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
     
     public static void main (String [] args){
            Graph graph = new Graph();
            graph.createGraph();
            Integer [] values = new Integer [50] ;
            for (int i = 0 ; i < 50 ; i++)
                values[i] = i ;
            graph.setValues(values);
     
            JScrollPane scroll = new JScrollPane(graph);
            scroll.getViewport().add(graph, null); 
     
            JFrame frame = new JFrame();
            frame.add(scroll);
            //scroll.setBounds(frame.getBounds());
            //scroll.setViewportView(graph);
            //scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
     
            //scroll.setVisible(true);
     
     
            //frame.getContentPane().add(scroll);
            frame.setSize(350, 700);
            //frame.pack();
            frame.setVisible(true);
            frame.repaint();
     
     
        }

    la class Graph étant une classe qui étant JPanel que j'ai trouvé sur le net.
    je tiens a préciser que je ne peux pas utiliser des api comme JFreeChart pour l'histogramme car celui la n'est qu'une premiere partie du travail que j'ai a faire pour mon stage!

    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Hello,

    Citation Envoyé par MeDReD Voir le message
    la class Graph étant une classe qui étant JPanel que j'ai trouvé sur le net.
    alors comme ça, tu peux utiliser des classes trouvées sur le net mais pas des API trouvées sur le net??

    Plus sérieusement, tu pense qu'on va pouvoir t'aider si tu:
    1) ne donnes pas le code de la classe Graph
    2) n'indiques pas où se trouve le problème
    3) n'essaies pas de faire un effort de compréhension?

    alors retour à la case départ. Fais un post correct et peut-être qu'on y répondra.


  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2008
    Messages : 23
    Par défaut
    je suis vraiment desole si j'ai pu paraitre imprécis sur ce que j'ai voulu demander.
    en fait l'objectif de ce que je veux atteindre est de faire un visualisateur d'activité d'une base de donnée Postgre a partir de son log.
    donc dans un preimer temps j'aurai besoin de faire un histogramme avec les durée de chaque requete.
    le petit souci dans l'histoire c'est que mon maitre de stage ne veux pas que j'utilise d'API du style JFreeChart mais plutot que je code a la main vu que l'histogramme n'est qu'une toute petite partie du travail final.
    et la je viens au probleme que j'ai eu avec mon code, c'est que je n'arrive pas a afficher de scrollbar dans la fenetre ( je pense que c'est du au redimensionnement automatic des bar dans la fenetre !!) surtout que je devrait afficher une dixaine de millier de requete :s
    étant un débutant en swing, j'ai pris le code de la class Graph ci dessous :
    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
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
     
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import javax.swing.*;
     
     
     
    public class Graph extends JPanel{
     
        //le type de graphique que l'on souhaite
        public static final int VALUES_ONLY                    = 0;
        public static final int VALUES_AND_STRING              = 1;
        public static final int VALUES_STRING_AND_COLOR        = 2;
        public static final int VALUES_STRING_COLOR_AND_LADDER = 3;
        public static final int VALUES_AND_COLOR               = 4;
        public static final int VALUES_AND_LADDER              = 5;
        //les proprietées
        private int         CURRENT_TYPE                       = 0;
        private Object[]    VALUES                             = {1 , 3 , 5 , 10} ;
        private Object[][] _VALUES                             = null ;
        private Object[][]  LADDER                             = null ;
     
        public Graph(){
            super();
            setOpaque ( true );
            setBackground(Color.WHITE);
            setSize(800,600);
            setBounds(0,0,800,600);
            setLayout(null);
     
        }
     
        public void createGraph(){
            repaint();
     
        }
        @Override
     
        public void paint(Graphics g){
            //pour avoir le fonds blanc
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, getSize().width, getSize().height);
            //on place la légende avant d'ajouter les valeurs
            try{
                if(CURRENT_TYPE == VALUES_STRING_COLOR_AND_LADDER || CURRENT_TYPE == VALUES_AND_LADDER ){
                   for ( int i = 0 ; i < LADDER.length ; i++){
                    try{
     
                        g.setColor(Color.RED);
                        g.drawLine(0, getSize().height-(Integer)LADDER[i][0],getSize().width , getSize().height-(Integer)LADDER[i][0]);
                        g.setColor(Color.BLACK);
                        g.drawString( LADDER[i][1].toString(), 10,getSize().height-(Integer)LADDER[i][0]);
                    }
                    catch(Exception e){System.out.println("!");}
                    }
     
     
                }
     
            }
     
            catch (NullPointerException e){
                System.err.println(
                        "Missing type Exception_ Veuillez renseigner le type de graphique");
                e.printStackTrace();
                return ;
            }
            //on dessine apres les valeurs en fonction de la demande
            if ( CURRENT_TYPE == VALUES_ONLY || CURRENT_TYPE == VALUES_AND_LADDER){
     
                //recuperation de la valeur maximale des stats a traiter
                int max = getMaxValue(true);
                //on recupere le rapport proportionel valeur / hauteur du graph
                float rapport = (float)((float)(getSize().height-50 )/ (float)max);
                //calcul de la position x des  batons
                int sizeX = ((getSize().width)-((VALUES.length*20)+20))/VALUES.length;
                //convertion du graphics en grahics2D pour l'effet de dégradé
                Graphics2D g2 = (Graphics2D)g;
                for ( int i = 0 ; i < VALUES.length ; i ++ ){
                    int locationY = (getSize().height-(int)(rapport * (Integer)VALUES[i]));
                    int locationX = (i*sizeX)+(i*20)+20;
     
                    g2.setPaint(new GradientPaint(0,0,Color.BLUE,getSize().width,getSize().height,Color.GREEN,true));
                    g2.fillRect(
                            locationX
                            , locationY
                            , sizeX, 600 );
                    g.setColor(Color.BLACK);
                    g.drawRect(locationX
                            , locationY
                            , sizeX, 600 ); 
                }
            }
            if (CURRENT_TYPE == VALUES_AND_STRING){
     
                //recuperation de la valeur maximale des stats a traiter
                int max = getMaxValue(false);
                //on recupere le rapport proportionel valeur / hauteur du graph
                float rapport = (float)((float)(getSize().height-50 )/ (float)max);
                //calcul de la position x des  batons
                int sizeX = ((getSize().width)-((_VALUES.length*20)+20))/_VALUES.length;
                //convertion du graphics en grahics2D pour l'effet de dégradé
                Graphics2D g2 = (Graphics2D)g;
                for ( int i = 0 ; i < _VALUES.length ; i ++ ){
                    int locationY = (getSize().height-(int)(rapport * (Integer)_VALUES[i][0]));
                    int locationX = (i*sizeX)+(i*20)+20;
     
                    g2.setPaint(new GradientPaint(0,0,Color.BLUE,getSize().width,getSize().height,Color.GREEN,true));
                    g2.fillRect(
                            locationX
                            , locationY
                            , sizeX, 600 );
                    g.setColor(Color.BLACK);
                    g.drawRect(locationX
                            , locationY
                            , sizeX, 600 ); 
                   g.drawString(_VALUES[i][1].toString(), locationX, locationY-10); 
                }
            }
            if(CURRENT_TYPE == VALUES_STRING_AND_COLOR || CURRENT_TYPE == VALUES_STRING_COLOR_AND_LADDER ){
                //recuperation de la valeur maximale des stats a traiter
                int max = getMaxValue(false);
                //on recupere le rapport proportionel valeur / hauteur du graph
                float rapport = (float)((float)(getSize().height-50 )/ (float)max);
                //calcul de la position x des  batons
                int sizeX = ((getSize().width)-((_VALUES.length*20)+20))/_VALUES.length;
     
                for ( int i = 0 ; i < _VALUES.length ; i ++ ){
                    int locationY = (getSize().height-(int)(rapport * (Integer)_VALUES[i][0]));
                    int locationX = (i*sizeX)+(i*20)+20;
     
     
                    g.setColor((Color)_VALUES[i][2]);
                    g.fillRect(locationX
                            , locationY
                            , sizeX, 600 );  
                    g.setColor(Color.BLACK);
                    g.drawRect(locationX
                            , locationY
                            , sizeX, 600 ); 
                   g.drawString(_VALUES[i][1].toString(), locationX, locationY-10); 
                }
            }
            if(CURRENT_TYPE == VALUES_AND_COLOR){
     
                 //recuperation de la valeur maximale des stats a traiter
                int max = getMaxValue(false);
                //on recupere le rapport proportionel valeur / hauteur du graph
                float rapport = (float)((float)(getSize().height-50 )/ (float)max);
                //calcul de la position x des  batons
                int sizeX = ((getSize().width)-((_VALUES.length*20)+20))/_VALUES.length;
     
                for ( int i = 0 ; i < _VALUES.length ; i ++ ){
                    int locationY = (getSize().height-(int)(rapport * (Integer)_VALUES[i][0]));
                    int locationX = (i*sizeX)+(i*20)+20;
     
     
                    g.setColor((Color)_VALUES[i][1]);
                    g.fillRect(locationX
                            , locationY
                            , sizeX, 600 );  
                    g.setColor(Color.BLACK);
                    g.drawRect(locationX
                            , locationY
                            , sizeX, 600 ); 
     
                }
            }
        }
     
        private int getMaxValue(boolean isSingleTable){
     
            if (isSingleTable){
            int max = 0 ;
            for ( int i = 0 ; i < VALUES.length ; i ++ ){
                if( (Integer)VALUES[i] > max){
                    max = (Integer)VALUES[i];
                }
            }
     
            return max ;
            }
            else{
                int max = 0 ;
            for ( int i = 0 ; i < _VALUES.length ; i ++ ){
                if( (Integer)_VALUES[i][0] > max){
                    max = (Integer)_VALUES[i][0];
                }
            }
     
            return max ;
     
            }
        }
        //les getters
        public int getType(){
            return CURRENT_TYPE ;
        }
        public Object[] getValues(){
            return VALUES ;
        }
        public Object[][]getMiltipleValues(){
            return _VALUES;
        }
        public Object[] getLadder(){
            return LADDER;
        }
        //les setters
     
     
        public void setType(int type){
            CURRENT_TYPE = type ;
        }
        public void setValues( Object [] values){
            VALUES = values ;
        }
        public void setValues( Object [][] values){
            _VALUES = values ;
        }
        public void setLadder(Object [][] ladder){
            LADDER = ladder ;
        }
    }
    le main que j'ai essayé est :

    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
     
     public static void main (String [] args){
            Graph graph = new Graph();
            graph.createGraph();
            Integer [] values = new Integer [50] ;
            for (int i = 0 ; i < 50 ; i++)
                values[i] = i ;
            graph.setValues(values);
     
            JScrollPane scroll = new JScrollPane(graph);
            scroll.getViewport().add(graph, null); 
     
            JFrame frame = new JFrame();
            frame.add(scroll);
            frame.repaint();
            scroll.setBounds(0 , 0 , 8000 , 600 );
            //scroll.setViewportView(graph);
            scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
            //scroll.s
            //scroll.setVisible(true);
     
     
            //frame.getContentPane().add(scroll);
            frame.setSize(350, 700);
            //frame.pack();
            frame.setVisible(true);
            //frame.repaint();
     
     
        }
    merci de bien vouloir me repondre ou de demander d'autre précision si nécessaire et encore desolé pour le premier message

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    1) Dans ton main tu peux directement supprimer la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     scroll.getViewport().add(graph, null);

    2) Le JScrollPane se sert de la preffered size du composant qu'il contient pour savoir s'il doit permettre le scroll ou nom. Or à aucun moment tu ne settes la preferredSize de ton composant Graph.

  5. #5
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2008
    Messages : 23
    Par défaut
    j'ai essayé le code suivant mais ça ne marche tjrs pas (peut etre que j'ai une erreure)
    mais je pense que mon probleme viens du fait que les barres sont dimensionner automatiquement en fonction de la taille de mon panel ou de ma frame, et je ne sais pas comment réglé ça!!
    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
     
    public static void main (String [] args){
            Graph graph = new Graph();
            graph.createGraph();
            Integer [] values = new Integer [50] ;
            for (int i = 0 ; i < 50 ; i++)
                values[i] = i ;
            graph.setValues(values);
     
            JScrollPane scroll = new JScrollPane(graph);
            scroll.setPreferredSize(new Dimension (300,100));
            JFrame frame = new JFrame();
            frame.add(scroll);
            frame.repaint();
            scroll.setBounds(0 , 0 , 8000 , 600 );
            scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
            frame.setSize(350, 700);
            frame.setVisible(true);
     
        }

  6. #6
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tu utilises de un NullLayout ce qui est une bad practice en soi.

    De plus tu donne des bounds complêtement surréalistes à ton JScrollPane (genre 8000*600) ce qui est largement plus grand que la preferredSize de ton Graph. Or le nullLayout fait que le composants ne se redimensionnement pas, donc ton JScrollPane reste ad vitam aeternam plus grand que ton graphe.

    Don utilises tout simplement un Layout Manager digne de ce nom et non un null layout.


    Dans ton cas un BorderLayout (le LayoutManager par défaut de la JFrame) fera l'affaire.

    De plus tu n'avait pas setté la preferredSize de ton graph mais celle de ton JScrollPane, contrairement à mon indication précédente. Le JScrollPane se sert de la preferredSize de sont contenu pour savoir s'il doit activer le Scroll ou non

    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
     
     
        	Graph graph = new Graph();
        	graph.createGraph();
        	Integer [] values = new Integer [50] ;
        	for (int i = 0 ; i < 50 ; i++)
        		values[i] = i ;
        	graph.setValues(values);
        	     	graph.setPreferredSize(new Dimension (300,100));
        	JScrollPane scroll = new JScrollPane(graph);
        	scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        	JFrame frame = new JFrame();
        	frame.add(scroll);
        	frame.setSize(350, 700);
        	frame.setVisible(true);

  7. #7
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2008
    Messages : 23
    Par défaut
    merci pour la reponse,
    en ce qui concerne les bounds c'est pas qui les ai mis mais mon maitre de stage pour tester un truc mais je ne me rapel plus pourquoi!!
    j'ai retester le code que tu m'as donné est ça ne marche tjrs pas!!!
    toujours le meme résultat i.e le graphe qui se redimensionne en fonction de la taille de ma Jframe ( kan la taille de cette dernière et asser petite je ne voi rien : largeur de la barr inférieur a un pixel!!)

  8. #8
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    En fait le solution que je t'ai donné marche, c'est juste que tu as mis une taille trop petite dans la preferredSize

  9. #9
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2008
    Messages : 23
    Par défaut
    oui merci,
    j'ai changer la taille du preferedsize et je vois bien l'aparition de la scrollbar parcontre il y a toujours le problem de la taille des barres!!
    si parexemple je choisi d'afficher 100 barres je ne vois rien car la taille des barres est inférieur a 1 pixel!!! (sachant que dans le projet je dois afficher plus de 100000 barres

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le problème viens du fait que tu détermines la taille des barres en fonction de la taille de ton composant dans la méthode paint, donc fixes une taille de barre constante (ou du moins convenable en rapport avec la résolution de ton écran). Puis fixe la preferredSize de ton composant en fonction du nombre de barres qu'il contient.

  11. #11
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2008
    Messages : 23
    Par défaut
    j'ai réussi a réglé ce problème mais il y en a un autre qui resort mnt!!! (a croire que ça n'en finira jamais )
    mnt avec la scroll bar j'arrive pas a atteindre la fin du diagramme!!
    pour etre plus précis, je ne vois que les 40 première valeur donc je peut utiliser la scoll bar en fonction de la taille de ma frame mais en mode plein ecran il n'y a plus de scroll bar et je ne peut pas aller jusqu'a la fin du diagramme dans tous les cas

  12. #12
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Il faut que tu calcules la preferredSize de ton Graph en fonction de ce que tu dessines dedans (cf mon message précédent).

    Par ex si tu mets 10 barres, ton Graph aura pour prefferedSize 10*taille d'une barre +11 * espace inter barres (11 car un espace au début et à la fin)

  13. #13
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2008
    Messages : 23
    Par défaut
    merci beaucoup pour ton aide j'ai réussi a mettre ça en route
    reste biensur quelque petite amélioration a faire mais bon!

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

Discussions similaires

  1. Afficher pourcentage dans un histogramme
    Par Pietro_L dans le forum Excel
    Réponses: 6
    Dernier message: 14/04/2017, 13h09
  2. Changer la couleur des barres dans un histogramme
    Par niepoc dans le forum MATLAB
    Réponses: 5
    Dernier message: 11/09/2008, 17h51
  3. Quantité de données dans un histogramme
    Par MeDReD dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 04/06/2008, 16h23
  4. [bar] Faire varier la couleur dans un histogramme
    Par totooo dans le forum MATLAB
    Réponses: 7
    Dernier message: 23/12/2007, 13h14
  5. [Jfreechart] Afficher intitulé barre dans un histogramme
    Par keumlebarbare dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 28/11/2006, 15h57

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