2009-10-05 6 views
2

J'ai besoin de savoir quand le texte d'un JButton est tronqué par la mise en page. Ainsi, afin de découvrir que je suis Redéfinition de la méthode suivante dans notre délégué ButtonUI personnalisé:Comment savoir par programme quand le texte d'un JButton est tronqué?

protected void paintText(Graphics g, JComponent c, Rectangle textRect, String text) { 
    //the text argument will show an ellipse (...) when truncated 
} 

Dans la méthode que je vérifie pour voir si l'argument de texte se termine par une ellipse.

Y a-t-il une meilleure façon de vérifier si le texte est tronqué? Qu'en est-il de l'ellipse? Est-ce le symbole universel du texte tronqué ou dois-je rechercher des symboles localisés qui délimiteront le texte tronqué? J'ai remarqué que OSX utilisera un seul caractère représentant l'ellipse et Windows utilisera trois périodes. Je suppose que cela est basé sur la police utilisée, mais cela m'a fait penser à d'autres choses qui peuvent me faucher.

Merci.

Répondre

2

Cela ne fonctionnerait-il pas si vous comparez le texte transmis à votre méthode paintText avec le texte renvoyé par ((AbstractButton)c).getText()? Si c'est différent, le texte a été tronqué. Finalement, la troncation elle-même est faite en SwingUtilities.layoutCompoundLabel et vous pouvez appeler cette méthode vous-même, mais il ne semble pas particulièrement facile de calculer tous les arguments dont vous avez besoin pour utiliser cette méthode directement.

+0

J'aime cette solution. Je peux arrêter de chercher une ellipse et afficher l'info-bulle à chaque fois que le texte diffère. –

1

J'ai mis en place une petite application pour démontrer comment vous pouvez comprendre. La viande est dans la méthode getToolTipText() surchargée dans mon JButton. Il teste la taille du bouton, en tenant compte des encarts de droite et de gauche, par rapport à la taille du texte, en utilisant 'FontMetrics'. Si vous exécutez la démonstration, vous pouvez redimensionner la fenêtre et survoler pour tenter d'obtenir le conseil de l'outil. Je devrais seulement montrer s'il y a une ellipse. Voici le code:

public class GUITest { 
    JFrame frame; 
    public static void main(String[] args){ 
     new GUITest(); 
    } 
    public GUITest() { 
     frame = new JFrame("test"); 
     frame.setSize(300,300); 
     addStuffToFrame(); 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       frame.setVisible(true); 
      } 
     }); 
    }  

    private void addStuffToFrame() {  
     JPanel panel = new JPanel(); 
     JButton b = new JButton("will this cause an elipsis?") { 
      public String getToolTipText() { 
       FontMetrics fm = getFontMetrics(getFont()); 
       String text = getText(); 
       int textWidth = fm.stringWidth(text); 
       return (textWidth > (getSize().width - getInsets().left - getInsets().right) ? text : null); 
      } 
     }; 
     ToolTipManager toolTipManager = ToolTipManager.sharedInstance(); 
     toolTipManager.registerComponent(b); 
     frame.setContentPane(b); 
    } 


} 
+1

Cette approche est trop naïve, au moins pour les fonctionnalités génériques. Il ne prend pas en compte les incrustations du bouton (bordure interne autour du texte), si le bouton affiche une icône et l'écart entre l'icône et le texte. Il échouera également si le texte contient un balisage HTML. – jarnbjo

1

Je suppose que le ellispse sera affiché lorsque

getPrefferredSize().width > getSize().width 
Questions connexes