gfive | A trouvé:!!!!
Code :
- public void mousePressed(GTable parent, MouseEvent e) {
- Component source = (Component) e.getSource();
- Graphics g = source.getGraphics();
- int maxwidth = source.getSize().width - 10;
- Point p = e.getPoint();
-
- int cellwidth = parent.getColWidth(parent.getColumn(p));
- if (g.getFontMetrics().stringWidth(value) > cellwidth) {
- //if (!isshowing) {
- int x, y, height, width;
- Vector lines = splitText(g.getFontMetrics(), tooltiptext, maxwidth);
- width = 0;
- for (int i = 0; i < lines.size(); i++) {
- width = Math.max(width, g.getFontMetrics().stringWidth((String) lines.elementAt(i)) + 8);
- }
-
- height = (g.getFontMetrics().getHeight() * lines.size()) + 6;
- x = Math.min(p.x - (width / 2), maxwidth - width) + 5;
- x = Math.max(5, x);
- y = Math.min(p.y, source.getSize().height - height) - 2;
- showToolTip(g, x, y, width, height, lines);
- isshowing = true;
- } else {
- enabled = false;
- source.repaint();
- }
- }
- public void mouseReleased(GTable parent, MouseEvent e) {
- ((Component) e.getSource()).repaint();
- }
- private Vector splitText(FontMetrics fm, String text, int width) {
- String origin = text;
- Vector lines = new Vector();
- StringBuffer begin = new StringBuffer();
-
- if (fm.stringWidth(text) < width) {
- lines.addElement(text);
- } else {
- int index = 0;
- while (index < text.length()) {
- while ((index < text.length()) &&
- (fm.stringWidth(begin.toString()+text.charAt(index)) < width)) {
- begin.append(text.charAt(index));
- index++;
- }
- if (index == text.length()) {
- lines.addElement(begin.toString());
- } else {
- int lastspace = begin.toString().lastIndexOf(" " );
- if (lastspace == -1) {
- lines.addElement(begin.toString());
- } else {
- lines.addElement(begin.toString().substring(0, lastspace + 1));
- index = index - (begin.length() - (lastspace + 1));
- }
- begin.setLength(0);
- }
- }
- }
- return lines;
- }
- private void showToolTip(Graphics g, int x, int y, int width, int height, Vector lines) {
- g.setClip(x, y, width + 1, height + 1);
- g.setColor(tooltipback);
- g.fillRoundRect(x+1, y + 1, width, height, 3, 3);
- g.setColor(tooltipfore);
- g.drawRoundRect(x, y, width, height, 3, 3);
- int lineheight = g.getFontMetrics().getHeight() + 2;
- for (int i = 0; i < lines.size(); i++) {
- g.drawString((String) lines.elementAt(i), x + 4, y + 3 + g.getFontMetrics().getAscent() + (i * lineheight));
- }
- }
- public String toString() {
- return value;
- }
-
-
- public boolean enabled() {
- return enabled;
- }
- public void setValue(String text) {
- this.value = text;
- }
- public void setToolTip(String text) {
- this.tooltiptext = text;
- }
|
Bon, en gros, c'est un bout de code d'une class qui sert à dessiner une cellule de tableau. Quand le tableau (class GTable) détecte un évènement de souris, elle le passe à la cellule concernée, en appellant : mousePressed(GTable parent, MouseEvent e)
(en fait, dans GTable, j'ai une méthode getCell(Point p) du coup, dans mousePressed(MouseEvent e) , je fais : Cell cell = getCell(e.getPoint());
if (cell != null) {
cell.mousePressed(this, e);
}
et pareil pour MouseReleased, MouseMoved, etc....
ce qui me permet de faire capter les évènements souris à des objets qui ne sont pas des composants AWT)
Ensuite, le dessin du tooltip, et tout ça, c'est relativement basique, en fait.
Y'a que la partie splitText() qui te laissera peut petre un peu perplexe : en fait, le tooltip que tu dessine ne pourra pas dépasser le cadre du composant parent, normalement...donc, il faut découper le texte du tooltip, s'il est trop long et qu'il dépasse de la taille max. possible.
ouala ouala... |