如何以编程方式知道何时截断JButton文本?

时间:2009-10-05 21:00:33

标签: java swing

我需要知道JButton的文本何时被布局截断。因此,为了找出我在我们的自定义ButtonUI委托中重写以下方法:

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

在方法内部,我检查文本参数是否以椭圆结尾。

有没有更好的方法来检查文本是否被截断?椭圆怎么样?这是截断文本的通用符号,还是我需要查找将划分截断文本的本地化符号?

我注意到OSX将使用表示椭圆的单个字符,Windows将使用三个句点。我认为这是基于使用的字体,但它让我想到了可能偷偷摸摸的其他事情。

感谢。

3 个答案:

答案 0 :(得分:2)

如果将传递给paintText方法的文本与((AbstractButton)c).getText()返回的文本进行比较,会不会有效?如果不同,则文本已被截断。

最终,截断本身在SwingUtilities.layoutCompoundLabel中完成,您可以自己调用该方法,但计算直接使用该方法所需的所有参数似乎并不容易。

答案 1 :(得分: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);
    }


}

答案 2 :(得分:1)

我猜想

时会显示ellispse
getPrefferredSize().width > getSize().width