[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:
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());
}
} |