_________________________________
|
| This is some really long text that I want to fit in the small label
|________________________________
^^^ YOUR LABEL ^^^
假设您希望将长文本放入该标签中
这是你能做的(这只是一个猜测,我正在做这个)
从一个String中的三个点...开始李>
开始逐个添加附加字符李>
获取JLabel的宽度李>
添加更多字符时,使用FontMetrics测量文本的长度(以像素为单位)
只要文本的像素长度小于JLabel的宽度,就继续添加更多字符
一旦它变得大于JLabel的宽度,就退出循环李>
将此新形成的文本设置为JLabel的文本
你应该这样结束:
_________________________________
|
| ...This is some really long tex
|________________________________
^^^ YOUR LABEL ^^^
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();
}
});
}
}
输出
# 2 楼答案
我认为这是一种系统行为,而不是JLabel,所以你不能真正做到这一点
# 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;
}
};
# 1 楼答案
可以考虑使用^ {CD1>}。类以查看当前字体下文本的长度
假设您希望将长文本放入该标签中
这是你能做的(这只是一个猜测,我正在做这个)
String
中的三个点...
开始李>JLabel
的宽度李>FontMetrics
测量文本的长度(以像素为单位)JLabel
的宽度,就继续添加更多字符JLabel
的宽度,就退出循环李>JLabel
的文本你应该这样结束:
下面是一个开始使用
FontMetrics
的简单方法。避免那里的争吵。按照公认的答案去做:Java: Friendlier way to get an instance of FontMetricsSSCCE符合OP真正想要的,而不是我解释的
输出
# 2 楼答案
我认为这是一种系统行为,而不是
JLabel
,所以你不能真正做到这一点# 3 楼答案
我有另一个解决方案,它依赖于LabelUI。首先是守则:
我们的目标是让Swing计算所有内容,包括其剪裁的字符串,并将其作为提示来执行我们自己的左剪裁。 诀窍是我们必须向super方法提供反向字符串,因为我们的结果将剪辑前导字符,所以我们需要确保计算是正确的。字符有不同的宽度
对我来说,主要的优势是,与当前在UI之前计算新大小的解决方案相比,开销非常小,UI也将开始做同样的事情
编辑:更改代码以在未剪裁时还原原始字符串