当JLabel中的文本太长时,在文本的末尾会出现可见的3个点。是否有可能将它们放在开头?在JLabel的开头放置3个点
3
A
回答
4
您可以考虑使用FontMetrics
。类来查看当前字体下文本的长度。
_________________________________
|
| 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 ^^^
这里上手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();
}
});
}
}
输出
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
相关问题
- 1. 在JScrollPane中放置JLabel
- 2. 将JLabel拖放到另一个JLabel上
- 3. 如何在每一行的开头放置一个空格?
- 4. 将JLabel放在另一个具有图像的JLabel的顶部
- 5. Roguelike开发 - jlabel jlabel
- 6. 如何在JLabel中放置大标题?
- 7. 如何将Netbeans一个Jlabel放置在另一个
- 8. 开放的fancybox 3
- 9. 保持一个开放的划伤,开放成从头VIM
- 10. 拖放JLabel
- 11. 拖放JLabel
- 12. 并排放置3个div
- 13. 在镜头前放置一个物体
- 14. 以特定字开头的开放式树节点
- 15. 带3个JLabel的JList内部
- 16. 2- VS 3个参数的开放“ - ”
- 17. 哪个JLabel被点击过?
- 18. 在布局中放置3个图像
- 19. 在3D中放置3个多边形
- 20. Java Swing - 将JLabel中的图像放置到第二个JLabel上(地图,播放器指示器)
- 21. 拖动一个JLabel用的TransferHandler(拖放)
- 22. ffmpeg可以在文件的开头放置Mp4元信息吗?
- 23. 将光标放在每行的开头
- 24. 将JLabel放置在所需位置并给出其坐标
- 25. Doxygen的:放置在单个地点
- 26. 不同的JLabel声明在JPanel上点击并放下
- 27. 把一个div放在一个表格单元格的开头
- 28. matplotlib:如何在scatter上注释点自动放置的箭头?
- 29. 在XML父节点的开头添加一个节点
- 30. 放置DIV在asp.net MVC 3
不直接认识,而不是需要的,但问了几个时间XxxRenderer较长说明(默认情况下有一个JLabel作为渲染器组件) – mKorbel
@LittleChild这是一种规范的要求,不是我的任性 – tobi
@tobi我有想出一个疯狂的答案。看看是否有帮助。 –