2009-09-04 10 views
1

c'est au-delà de moi (pardonner, il est tard). Je sous-classe un WindowsSliderUI, parce que je veux qu'il dessine un plus grand pouce (est-ce le bon mot?) (Cela fonctionne) et affiche également la valeur du curseur juste au-dessus (comme, par exemple, gtk look and feel) (c'est cassé). Je redéfinissant la méthode de peinture(), et au moment où il se présente comme suit: (il est long, mes changements sont près du fond):java - pourquoi graphics.drawString() ne se redessine pas?

Rectangle knobBounds = thumbRect; 
     int w = knobBounds.width; 
     int h = knobBounds.height;  

     g.translate(knobBounds.x, knobBounds.y); 

     if (slider.isEnabled()) { 
      g.setColor(slider.getBackground()); 
     } 
     else { 
      g.setColor(slider.getBackground().darker()); 
     } 

    Boolean paintThumbArrowShape = 
     (Boolean)slider.getClientProperty("Slider.paintThumbArrowShape"); 

    if ((!slider.getPaintTicks() && paintThumbArrowShape == null) || 
     paintThumbArrowShape == Boolean.FALSE) { 

     // "plain" version 
      g.fillRect(0, 0, w, h); 

      //THE ONES THAT MATTER 
      g.setColor(Color.BLACK); 
      String val = slider.getValue()+""; 
      g.drawString(val, 0, 0); 
      g.setColor(Color.RED); 
      g.drawLine(0, 0, 30, 8); 
      //END 

      g.setColor(Color.black); 
      g.drawLine(0, h-1, w-1, h-1);  
      g.drawLine(w-1, 0, w-1, h-1);  

      g.setColor(getHighlightColor()); 
      g.drawLine(0, 0, 0, h-2); 
      g.drawLine(1, 0, w-2, 0); 

      g.setColor(getShadowColor()); 
      g.drawLine(1, h-2, w-2, h-2); 
      g.drawLine(w-2, 1, w-2, h-3); 
     } 

tout ce que je veux est d'obtenir la valeur affichée juste au-dessus de la pouce. cependant, ce qui se passe maintenant, c'est que la chaîne est affichée initialement, mais quand je glisse le curseur, il reste au même endroit (sans changer de valeur) jusqu'à ce que je relâche le bouton de la souris, où il est redessiné au bon endroit valeur. et juste pour rendre ma tête encore plus drôle, la méthode drawLine() fonctionne bien - la ligne est toujours sur le pouce quand je la fais glisser. maintenant, c'est probablement une erreur triviale (je ne suis vraiment pas bon, et fatigué), mais s'il vous plaît aidez-moi à le trouver. Attention, si vous voyez une meilleure approche de tout le problème, faites le moi savoir. Comme je l'ai dit, je ne suis vraiment pas bon avec ça, et j'ai tendance à rendre les choses plus compliquées qu'elles ne le sont.

merci beaucoup

Répondre

5

Je ne connais pas la réponse complète, mais votre appel à

g.drawString(val, 0, 0); 

semble louche. Les coordonnées que vous spécifiez à drawString sont la ligne de base du caractère le plus à gauche de la chaîne, pas le coin supérieur gauche de la chaîne. En règle générale, un appel comme le vôtre n'affiche rien, car la totalité ou la plus grande partie de la chaîne est dessinée en dehors du rectangle de découpage.

Peut-être que vous vouliez dire quelque chose comme ceci:

final int height = g.getFontMetrics().getAscent(); 
    g.drawString(s, 0, height); 
Questions connexes