2009-10-05 2 views
2

Мне нужно знать, когда текст для JButton усечен макетом. Итак, для того, чтобы выяснить, я переопределение следующего метода в нашем пользовательском ButtonUI делегате:Как программно узнать, когда текст JButton усечен?

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

В методе я проверяю, чтобы увидеть, если текст аргумент заканчивается эллипсом.

Есть ли лучший способ проверить, усечен ли текст? Как насчет эллипса? Это универсальный символ для усеченного текста, или мне нужно искать локализованные символы, которые будут разграничивать усеченный текст?

Я заметил, что OSX будет использовать один символ, представляющий эллипс, и Windows будет использовать три периода. Я предполагаю, что это основано на использовании шрифта, но это заставило меня задуматься о других вещах, которые могут подкрасться ко мне.

Спасибо.

ответ

2

Не работает ли он, если вы сравните текст, переданный вашему методу paintText с текстом, возвращаемым с ((AbstractButton)c).getText()? Если он отличается, текст был усечен.

В конце концов, само усечение выполняется в SwingUtilities.layoutCompoundLabel, и вы можете сами вызвать этот метод, но, как представляется, не так просто вычислить все аргументы, необходимые для непосредственного использования этого метода.

+0

Мне нравится это решение. Я могу перестать искать эллипс и просто показывать всплывающую подсказку в любое время, когда текст отличается. –

1

Я собрал небольшое приложение, чтобы продемонстрировать, как вы можете это понять. Мясо находится в избытке getToolTipText() метод в моем JButton. Он проверяет размер кнопки, составляя правую и левую вставки, в зависимости от размера текста, используя «FontMetrics». Если вы запустите демоверсию, вы можете изменить размер окна и навести указатель мыши, чтобы попытаться получить подсказку. Я должен показать только, есть ли многоточие. Вот код:

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

Этот подход слишком наивен, по крайней мере, для общих функций. Он не учитывает вставки кнопки (внутренняя граница вокруг текста), если на кнопке отображается значок и промежуток между значком и текстом. Он также потерпит неудачу, если текст содержит разметку HTML. – jarnbjo

1

Я предположил бы, что ellispse будет показан, когда

getPrefferredSize().width > getSize().width 
Смежные вопросы