有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在JLabel的开头加上3个点

当JLabel中的文本过长时,文本末尾会有3个可见点。可以把它们放在开头吗


共 (3) 个答案

  1. # 1 楼答案

    可以考虑使用^ {CD1>}。类以查看当前字体下文本的长度

    _________________________________
    |
    | 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. 一旦它变得大于JLabel的宽度,就退出循环
    7. 将此新形成的文本设置为JLabel的文本

    你应该这样结束:

    _________________________________
    |
    | ...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

  2. # 2 楼答案

    我认为这是一种系统行为,而不是JLabel,所以你不能真正做到这一点

  3. # 3 楼答案

    我有另一个解决方案,它依赖于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也将开始做同样的事情

    编辑:更改代码以在未剪裁时还原原始字符串