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 :

[Graphique] Réaliser des Histogrammes dynamiques


Sujet :

2D Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 59
    Points : 50
    Points
    50
    Par défaut [Graphique] Réaliser des Histogrammes dynamiques
    Bonjour, voici mon problème :
    - j'aimerai réaliser des histogrammes, donc typiquement des graphiques avec des barres verticales.
    - il faudrait pouvoir positionner à l'aide de la souris la valeur des niveaux des différentes barres.

    Jusque là, pas de problème - mon code fonctionne correctement.
    Le HIC, c'est lorsque je demande à la fenêtre de se redimensionner, alors les barres de l'histogramme sont remises à zéro.


    Voici le code de ma classe représentant les barres de mon histogramme.
    Elle est constituée de deux panneaux :
    - Un panneau de taille maximum ayant une couleur (la classe elle-même)
    - Un panneau de taille variable ayant une autre couleur (le panneau "interne")


    Alors, pour résumer ma question :
    Comment faire pour que la barre verte que je positionne à l'aide de la souris reste à sa "valeur" même lorsqu'on redimensionne la fenêtre contenant le tout ?

    Pour mieux comprendre le problème, veuillez exécuter la méthode "main" (interne à la classe pour des questions de facilité de tests) :
    - dimensionnez la barre en cliquant simplement dessus
    - redimensionnez la fenêtre et voyez le résultat

    Troublant et énervant.


    Merci d'avance pour votre aide !

    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
    package be.li3.richclient.swing.histogram;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    //import org.apache.log4j.Logger;
     
    public class HistoBar extends JPanel {
     
    	/**
             * Logger for this class.
             */
    	//private static final Logger logger = Logger.getLogger(HistoBar.class);
     
    	private static int width = 25;
     
    	private static int height = 250;
     
    	private static Color bgColor = Color.LIGHT_GRAY;
     
    	private static Color valueColor = new Color(0, 128, 25);
     
    	private static Color focusColor = new Color(128, 220, 0);
     
    	private static Color borderColor = Color.WHITE;
     
    	private JPanel key = new JPanel();
     
    	public HistoBar() {
     
    		Dimension dimMax = new Dimension(width, height);
    		setPreferredSize(dimMax);
     
    		Dimension valueDim = new Dimension(width, height);
    		key.setSize(valueDim);
    		key.setBackground(bgColor);
     
    		setBackground(valueColor);
    		setBorder(BorderFactory.createLineBorder(borderColor));		
    		addMouseListener(new MouseListener() {
     
    			public void mouseExited(MouseEvent e) {
    				key.setBackground(bgColor);
    			}
     
    			public void mouseEntered(MouseEvent e) {
    				key.setBackground(focusColor);			
    			}
     
    			public void mouseReleased(MouseEvent e) {
    			}
     
    			public void mousePressed(MouseEvent e) {
    			}
     
    			public void mouseClicked(MouseEvent e) {
     
    				Dimension size = key.getSize();					
    				if (e.getButton() == MouseEvent.BUTTON1) {
    					if (contains(e.getPoint())) {
    						int y = e.getPoint().y;
    						key.setSize(size.width, y);
    						//logger.info("sets the level : " + (height-y));
    					} // end if
    				} // end if
    			} // end method
    		});
     
    		setLayout(new BorderLayout());
    		add(key, BorderLayout.CENTER);
    	}
     
    	public static void main(String [] args) {
     
    		JFrame frame = new JFrame("test");
    		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     
    		JPanel bar = new HistoBar();		
    		JPanel panel = new JPanel();
    		panel.setBackground(Color.DARK_GRAY);
    		panel.add(bar);
     
    		Container content = frame.getContentPane();
    		content.add(panel);
    		frame.pack();
    		frame.setVisible(true);
     
    		//logger.debug("width = " + bar.getWidth());
    		//logger.debug("height = " + bar.getHeight());
     
    	}
    }

  2. #2
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Ce code là fonctionne:
    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
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.event.*;
     
    //import org.apache.log4j.Logger;
     
    public class HistoBar extends JPanel implements ComponentListener,MouseListener{
     
       /**
        * Logger for this class.
        */
       //private static final Logger logger = Logger.getLogger(HistoBar.class);
     
       private static int width = 25;
     
       private static int height = 250;
     
       private static Color bgColor = Color.LIGHT_GRAY;
     
       private static Color valueColor = new Color(0, 128, 25);
     
       private static Color focusColor = new Color(128, 220, 0);
     
       private static Color borderColor = Color.WHITE;
     
       private JPanel key = new JPanel();
       private int keySize;
     
       public HistoBar() {
          addComponentListener(this);
          Dimension dimMax = new Dimension(width, height);
          setPreferredSize(dimMax);
     
          Dimension valueDim = new Dimension(width, height);
          key.setSize(valueDim);
          key.setBackground(bgColor);
     
          setBackground(valueColor);
          setBorder(BorderFactory.createLineBorder(borderColor));      
          addMouseListener(this); 
     
          setLayout(new BorderLayout());
          add(key, BorderLayout.CENTER);
       }
     
       public void mouseExited(MouseEvent e) {
                key.setBackground(bgColor);
             }
     
             public void mouseEntered(MouseEvent e) {
                key.setBackground(focusColor);         
             }
     
             public void mouseReleased(MouseEvent e) {
             }
     
             public void mousePressed(MouseEvent e) {
             }
     
             public void mouseClicked(MouseEvent e) {
     
                Dimension size = key.getSize();               
                if (e.getButton() == MouseEvent.BUTTON1) {
                   if (contains(e.getPoint())) {
                      this.keySize = e.getPoint().y;
                      key.setSize(size.width, keySize);
                      //logger.info("sets the level : " + (height-y));
                   } // end if
                } // end if
             }
     
      	public void 	componentHidden(ComponentEvent e)
      	{}
     	public void 	componentMoved(ComponentEvent e)
     	{
     	Dimension size = key.getSize();
     	key.setSize(size.width, keySize);
     	}
    	public void 	componentResized(ComponentEvent e)
     	{
     	Dimension size = key.getSize();
     	key.setSize(size.width, keySize);
     	}
     	public void 	componentShown(ComponentEvent e){}
     
       public static void main(String [] args) {
     
          JFrame frame = new JFrame("test");
          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     
          JPanel bar = new HistoBar();      
          JPanel panel = new JPanel();
          panel.setBackground(Color.DARK_GRAY);
          panel.add(bar);
     
          Container content = frame.getContentPane();
          content.add(panel);
          frame.pack();
          frame.setVisible(true);
     
          //logger.debug("width = " + bar.getWidth());
          //logger.debug("height = " + bar.getHeight());
     
       }
    }
    Ceci dit, pour la forme, ça aurait été plus propre de dessiner le panel au lieu de lui donner une taille, mais bon, l'essentiel c'est que ça fonctionne. Bonne journée.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 59
    Points : 50
    Points
    50
    Par défaut
    merci !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 59
    Points : 50
    Points
    50
    Par défaut
    Cela fonctionne bien avec un resize de la fenêtre si on redimensionne de gauche à droite ou de façon oblique.

    Si on redimensionne la fenêtre verticalement, alors la barre "perd encore sa valeur"; idem si on ne valide pas l'action de redimensionnement de la fenêtre (quand on passe la souris sur le bord de la fenêtre, on voit la double flèche - si on clique et qu'on ne déplace pas la souris, là encore la valeur de la barre est "effacée" jusqu'à ce qu'on passe avec la souris au-dessus).

  5. #5
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Alors en faisant ç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
    public static void main(String [] args) {
     
          JFrame frame = new JFrame("test");
          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     
          HistoBar bar = new HistoBar();      //modif ici
          JPanel panel = new JPanel();
          panel.setBackground(Color.DARK_GRAY);
          panel.add(bar);
          frame.addComponentListener(bar); // et là
          Container content = frame.getContentPane();
          content.add(panel);
          frame.pack();
          frame.setVisible(true);     
     
     
       }
    et en supprimant la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    addComponentListener(this);
    dans le constructeur de HistoBar. Mais ça devient un peu de la programmation spagetti... Ca aurait été mieux de dessiner ton histogramme.

  6. #6
    Membre actif

    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Points : 229
    Points
    229
    Par défaut
    Bonjour,
    il existe des bibliotèques java très réputées pour la réalisation d'histogrammes et autres graphiques. et elles sont en open source

    http://java.developpez.com/outils/api/#charts

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 59
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par komando
    Bonjour,
    il existe des bibliotèques java très réputées pour la réalisation d'histogrammes et autres graphiques. et elles sont en open source

    http://java.developpez.com/outils/api/#charts


    Merci, c'est bien sympathique mais j'utilise déjà JFreeChart pour d'autres parties du projet.

    Ici ce qui m'intéressait c'était de pouvoir définir des histogrammes dynamiquement et simplement via des évènements (clicks de souris).


    Alors, j'ai modifié mon code : j'ai gardé la classe qui étend JPanel et je dessine moi-même le rectangle pour le niveau via la méthode paintComponent(Graphics g) surchargée.

    A présent tout fonctionne correctement.

    Merci à tous !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/06/2010, 13h41
  2. Créer un graphique avec des données dynamiques
    Par nikobell dans le forum Excel
    Réponses: 5
    Dernier message: 17/01/2010, 19h39
  3. Réponses: 1
    Dernier message: 28/01/2009, 09h01
  4. Quelle application pour réaliser des graphiques ?
    Par giuseppe2 dans le forum Débuter
    Réponses: 1
    Dernier message: 01/06/2008, 03h42
  5. Rave Reports : Réaliser des graphiques statistiques ?
    Par MaTHieU_ dans le forum Delphi
    Réponses: 1
    Dernier message: 02/11/2006, 10h03

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