【问题标题】:How to programatically know when a JButton's text is truncated?如何以编程方式知道按钮文本何时被截断?
【发布时间】:2009-10-05 21:00:33
【问题描述】:

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

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

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

有没有更好的方法来检查文本是否被截断?椭圆呢?这是截断文本的通用符号,还是我需要寻找可以区分截断文本的本地化符号?

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

谢谢。

【问题讨论】:

    标签: java swing


    【解决方案1】:

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

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

    【讨论】:

    • 我喜欢这个解决方案。我可以停止寻找椭圆,只要文本不同就显示工具提示。
    【解决方案2】:

    我已经制作了一个小应用程序来演示如何解决这个问题。肉在我的JButton 中被覆盖的getToolTipText() 方法中。它使用“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);
        }
    
    
    }
    

    【讨论】:

    • 这种方法太幼稚了,至少对于通用功能来说是这样。如果按钮显示图标以及图标和文本之间的间隙,它不考虑按钮的插图(文本周围的内部边框)。如果文本包含 HTML 标记,它也会失败。
    【解决方案3】:

    我猜椭圆会在什么时候显示

    getPrefferredSize().width > getSize().width
    

    【讨论】:

      猜你喜欢
      • 2012-07-25
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多