在JLabel的开头放3个点

时间:2013-10-22 13:56:06

标签: java swing jlabel

当JLabel中的文本太长时,文本末尾会显示3个点。是否有可能把它们放在一开始?

3 个答案:

答案 0 :(得分:4)

您可以考虑使用FontMetrics。 class来查看当前字体下文本的长度。

_________________________________
|
| This is some really long text that I want to fit in the small label
|________________________________

       ^^^ YOUR LABEL ^^^  

假设您希望将该长文本放入该标签中 这是你可以做的(这只是一个疯狂的猜测,我正在做这个)

  1. ...中的三个点String开始。
  2. 开始逐个添加附加字符。
  3. 获取JLabel的宽度。
  4. 在追加更多字符时,使用FontMetrics来衡量文字的长度(以像素为单位)
  5. 只要文字的像素长度小于JLabel
  6. 的宽度,请继续添加更多字符
  7. 一旦它变得大于JLabel的宽度,就离开循环。
  8. 将此新格式的文字设为JLabel
  9. 的文字

    你应该这样结束:

    _________________________________
    |
    | ...This is some really long tex
    |________________________________
    
           ^^^ YOUR LABEL ^^^  
    

    这是开始使用FontMetrics的简便方法。避免在那里争吵。只需按照接受的答案说明:Java: Friendlier way to get an instance of FontMetrics

    SSCCE 符合OP真正想要的而不是我解释的内容

    package stack;
    
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Toolkit;
    import java.awt.event.ComponentEvent;
    import java.awt.event.ComponentListener;
    
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.SwingUtilities;
    
    public class BackwardsDots extends JFrame{
    
        JLabel label = new JLabel(){
                            @Override
                            public Dimension getPreferredSize(){
                                return new Dimension(200,100);
                            }
                        };
        String text = "This is a design requirement and not my whim";
        FontMetrics fm;
        Font theFontBeingUsed;
    //--------------------------------------------------------------------------------  
        public BackwardsDots(){
            getContentPane().add(label);
            pack();
    
            theFontBeingUsed = new Font("Ubuntu",Font.BOLD,14);
            fm = Toolkit.getDefaultToolkit().getFontMetrics(theFontBeingUsed);
    
    
    
            label.setText(trimmedStringCalculator(text));
            label.setToolTipText(text);
            label.setBorder(BorderFactory.createDashedBorder(Color.RED));
            label.addComponentListener(new ComponentListener(){
    
                @Override
                public void componentHidden(ComponentEvent arg0) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void componentMoved(ComponentEvent arg0) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void componentResized(ComponentEvent arg0) {
                    label.setText(trimmedStringCalculator(text));
                }
    
                @Override
                public void componentShown(ComponentEvent arg0) {
                    // TODO Auto-generated method stub
    
                }
    
            });
    
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    //--------------------------------------------------------------------------------
        private String trimmedStringCalculator(String inputText){
            String ellipses = "...";
            String textToBeDisplayed = "";
    
            int widthOfJLabel = label.getWidth();
    
            for(int i = text.length()-1; i >= 0; i--){
                if(fm.stringWidth(ellipses + textToBeDisplayed) <= widthOfJLabel){
                    textToBeDisplayed = text.charAt(i) + textToBeDisplayed;
                }
            }
    
            String finalText;
            if(textToBeDisplayed.equals(inputText)){
                finalText = inputText;
            }else{
                finalText = ellipses.concat(textToBeDisplayed);
            }
    
            return finalText;
        }
    //--------------------------------------------------------------------------------  
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                @Override
                public void run(){
                    new BackwardsDots();
                }
            });
        }
    }
    

    <强>输出
    enter image description here

答案 1 :(得分:2)

我有另一种解决方案,它依赖于LabelUI。首先是代码:

LabelUI labelUI = new MetalLabelUI() {
    @Override
    protected String layoutCL(JLabel label, FontMetrics fontMetrics, String text, Icon icon, Rectangle viewR, Rectangle iconR, Rectangle textR) {
        String clipString = "...";
        // Use reversed text, because first characters may be larger or thinner than last ones.
        String reversedText = new StringBuilder(text).reverse().toString();
        // Let Swing do its magic.
        String result = super.layoutCL(label, fontMetrics, reversedText, icon, viewR, iconR, textR);

        // Not using .equals is intentional. Previous method will return a different instance
        // if and only if a clip operation occurred.
        if (result != text) {
            // Use the same character count, but starting with the end.
            result = clipString
                    + text.substring(text.length() - result.length() + clipString.length());
        } else {
            // Restore the original
            result = text;
        }

        return result;
    }

};

目标是让Swing计算所有内容,包括其剪切的字符串,并使用它作为提示来执行我们自己的左剪辑。 诀窍是我们必须为super方法提供反向字符串,因为我们的结果会剪切前导字符,我们需要确保计算是正确的。字符有不同的宽度。

与我在UI之前计算新大小的当前解决方案相比,我的主要优势是开销非常小,而且UI将开始做同样的事情。

编辑:更改代码以在未剪切时恢复原始字符串。

答案 2 :(得分:0)

我认为这是一种系统行为,超过JLabel,所以你无法真正做到这一点。