2013-10-22 30 views
3

当JLabel中的文本太长时,在文本的末尾会出现可见的3个点。是否有可能将它们放在开头?在JLabel的开头放置3个点

+0

不直接认识,而不是需要的,但问了几个时间XxxRenderer较长说明(默认情况下有一个JLabel作为渲染器组件) – mKorbel

+0

@LittleChild这是一种规范的要求,不是我的任性 – tobi

+0

@tobi我有想出一个疯狂的答案。看看是否有帮助。 –

回答

4

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

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

+0

从我从OP中了解到的情况来看,我认为他想要像'......适合小标签'那样的东西。这会更有意义。 – Flawyte

+0

这不是我想要的方式。在我的情况下,它应该打印如下内容:“...想要适应小标签” – tobi

+0

以'...'开头。创建一个名为'textTobeDisplayed'的新字符串,并向后迭代,即从文本的末尾开始向前移动。将字符追加到'textToBeDisplayed'的开头,然后测量总长度,即......的长度加上'textToBeDisplayed' =) –

0

我认为这是一个系统行为,超过JLabel的,所以你不能这样做。

1

我有另一种解决方案,它依赖于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; 
    } 

}; 

的目标是让秋千计算的一切,包括它的剪切字符串,并以此作为线索来执行我们自己的左裁剪。 诀窍是我们必须向super方法提供反转字符串,因为我们的结果会剪裁前导字符,所以我们需要确保计算是正确的。字符具有不同的宽度。

对于我来说,主要优势在于,与目前在UI之前计算新大小的解决方案相比,开销非常小,并且UI将开始执行相同的操作。

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

+1

很好的答案,谢谢;)。虽然实际上这可以做得更简单:LabelUI本身会附加点,所以只需将反转的'String'移交给'super.layoutCL(...)',然后再次反转就可以实现这一点,而不需要任何条件语句或字符串操作。 – Paul