如何在布置文本组件时修改Swing使用的剪辑字符串省略号

默认情况下,Swing使用省略号“…”来表示文本已在JLabel和类似的基于文本的组件中被截断。 是否可以更改此行为以使用其他字符串,例如“>”?

通过我在SwingUtilities2中找到的Swing代码,我发现了一个名为clipString(…)的方法,该方法似乎将字符串硬编码为“…”。

我不确定你能在Swing中设置它。 考虑制作自己的JLabel实现,根据需要截断字符串。

在这里,您可以使用SwingUtilities中的截断函数。 您可以从复制粘贴代码开始,这通常是一个良好的开端。

我认为您需要扩展JLabel的paintComponent方法,测量FontMetrics并确定标签是否需要截断。 如果它确实将文本设置为截断值。 请记住将未截断的值保留在字段中。

我使用的解决方案是这样的:

1)注册自定义LabelUI

2)LabelUI重写layoutCL()方法,用用户提供的省略号替换Swing椭圆。

public class LabelUI extends MetalLabelUI { private static final int SWING_ELLIPSES_LEN = "...".length(); private static final ComponentUI LABEL_UI_INSTANCE = new LabelUI(); private String displayedText; public static ComponentUI createUI(JComponent c) { return LABEL_UI_INSTANCE; } public String getText() { return displayedText; } protected String layoutCL(JLabel label, FontMetrics fontMetrics, String text, Icon icon, Rectangle viewR, Rectangle iconR, Rectangle textR) { displayedText = super.layoutCL(label, fontMetrics, text, icon, viewR, iconR, textR); String truncationString = (String)label.getClientProperty("LabelUI.truncationString"); if (truncationString != null && !displayedText.equals(text)) { displayedText = displayedText.subSequence(0, displayedText.length() - SWING_ELLIPSES_LEN) + truncationString; } return displayedText; } } 

3)通过在组件上设置客户端属性来提供新的省略号。

 JLabel component = ... ; component.putClientProperty("LabelUI.truncationString", ">");